pthread_mutex

等待线程pthread_join

用处:pthread_join使一个线程等待另一个线程结束

通常情况下,在没有使用pthread_join时,主线程结束使整个进程结束,那么新添加的线程可能在还没有被运行的时候就已经结束了。

加入pthread_join之后,主线程会一直等待直到被等待的线程结束才会结束。

1 int pthread_join(pthread_t thread,void **value_ptr);
2 thread:等待退出线程的线程号
3 value_ptr:退出线程的返回值

另一方面,主线程会依次等待线程,即在等待线程1结束之后再等待线程2。如果在线程1结束之后发现线程2已经结束,就会回收线程2的资源。

 

pthread_attr_setdetachstate

就好像人一样,有的人喜欢被别人等,有的人就不喜欢。此类线程不愿意调用pthread_join,我们称他们为detach的。在线程创建时,我们默认将线程的属性设置为joinable。

如果要将线程设置为detached,如下操作:

1 pthread_attr_t    attr;
2 pthread_attr_init(&attr);
3 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
4 pthread_create(&pthreadid,&attr,myprocess,&arg);

在线程被创建为joinable之后,可以通过pthread_detach使之成为detached。但是,反过来就不能这样。并且,在线程已经调用pthread_join后,在调用pthread_detach是不会起作用的。

pthread_cancel()

线程可以通过自身执行结束来结束,也可以通过调用pthread_exit()来结束线程的执行。此外,还可以通过pthread_cancel()来结束

int  pthread_cancel(pthread_t  thread);

另一方面,线程的结束分为两种,一种时同步终结,一种是异步终结。

同步终结不会立刻停止,会继续运行直到下一个结束点,线程默认的属性就是同步终结的。

而异步终结就会立刻被结束。

 

互斥量pthread_mutex_t

互斥量就是一把锁。多线程只有一把锁一个钥匙,所有线程的规则是解锁还需系锁人,谁上的锁谁开。只要一个线程访问一个共享变量时,先用所把变量锁住,然后再操作操作完成后,将锁释放掉。当另一个线程想要访问这个变量时,发现这个变量被锁住了,就会一直等待,直到这个锁消失,同样的,它也会上锁,重复此操作。

pthread_mutex_t类型,其本质就是一个结构体,将其简单理解为一个整数。

pthread_mutex_t mutex 变量只有两种取值0或者1

初始化方法如下:

1 #include<pthread.h>
2 pthread_mutex_init(pthread_mutex_t* restrict mutex,
3                              const pthread_mutexattr_t *restrict attr);                

返回值:成功返回0,否则返回错误编号。

restrict关键字:只用于限制指针,告诉编译器所有修改该指针指向内存中的操作,只能通过本指针完成。不能通过除了本指针之外的变量或指针修改。

接下来:第一个表示传出参数,调用时应传&mutex;第二个参数表示互斥属性。通常使用NULL,选择默认属性。

初始化又分为静态初始化和动态初始化

静态初始化:如果互斥锁mutex是静态分配的(定义在全局,或者加了static关键字修饰),则可以直接使用宏进行初始化。

pthread_mutex_t  mutex = PTHREAD_MUTEX_INITIALIZER;

动态初始化:即如上所说的

pthread_mutex_init(&mutex,NULL);

 

销毁一个互斥锁pthread_mutex_destroy

1 #include<pthread.h>
2 pthread_mutex_destory(pthread_mutex_t *mutex);

 

加锁pthread_mutex_lock

可以理解为mutex--

1 #include<pthread.h>
2 pthread_mutex_lock(pthread_mutex_t* mutex);

在没有被上锁时,当前线程会将这把锁锁上

被锁上时,当线程阻塞,锁被打开之后,线程解除阻塞。

 

解锁pthread_mutex_unlock

可以理解为mutex++

1 #include<pthread.h>
2 pthread_mutex_unlock(pthread_mutex_t* mutex);

同时,将阻塞在该锁上的所有线程全部唤醒

 

尝试加锁pthread_mutex_trylock

尝试加锁,失败返回,不阻塞

1 #include<pthread.h>
2 pthread_mutex_trylock(pthread_mutex_t* mutex);

在没有被上锁时,但钱线程会给这把锁加锁

已经上锁了:则不会阻塞,返回。

 

创建线程pthread_create

pthread_create(pthread_mutex_t* thrd1,pthread_attr_t attr,void thread_function(void argument),char* some_argument);

四个变量分别为:

1、一个线程变量名,被创建线程的标识

2、线程的属性指针,默认为NULL即可

3、被创建线程的程序代码

4、程序代码的参数

 

结束线程pthread_exit

pthread_exit(void* retval)

retval用于存放线程结束的突出状态

 

posted on 2020-10-22 17:50  QzZq  阅读(1093)  评论(0)    收藏  举报

导航