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用于存放线程结束的突出状态
浙公网安备 33010602011771号