pthread_kill 可以用来检测线程是否已经结束
#include <errno.h>
#include <signal.h>
#include <pthread.h>
rc = pthread_kill(tid,0);
rc: ESRCH 线程不存在或者已经结束
EINVAL 非法信号
否则的话,线程就是alive的
而pthread_join的调用会使程序阻塞在调用的那个位置
如pthread_join(tid1,NULL);
pthread_join(tid2,NULL); 此时,如果tid2 线程已经结束,但是tid1 还在执行中,那么程序依然会阻塞在pthread_join(tid1,NULL)处
pthread_mutex_lock(&mutex)
if(buffer !=0)
{
pthread_cond_wait(&cond,&mutex);
}
buffer = 100;
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&othercond);
上述为互斥锁与条件变量的常规使用
互斥锁只是对对象进行加锁操作,实现线程之间的同步,但是在实际的使用中,不是随便就去访问共享对象的,很多时候都是满足了一个具体的条件,我们才去访问一个共享对象,这个时候互斥锁就常常与条件变量一起使用,实现一些业务逻辑了。
pthread_cond_signal 会把信号发给所有等待些条件信号的线程,让所有满足条件的线程都参与竞争,但是操作系统会根据线程优先级,等待时间等属性来判断唤醒哪一个线程。(只唤醒其中的一个线程)
pthread_cond_broadcast 会唤醒所有等待些条件信号的线程