Linux多线程之条件变量

Linux线程同步-条件变量(虚假唤醒问题)

https://blog.csdn.net/ffilman/article/details/4871920

pthread_cond_wait实现原理

互斥锁虽然保证了临界区安全,线程访问不冲突,但是效率低。

一个线程锁死一个资源,其他需要该资源的线程只能等待。释放锁时,其他线程没有一种通知机制。

条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起配合使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其他的某个线程改变了条件变量,他将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线程间的同步。

pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)函数传入的参数mutex用于保护条件,因为我们在调用pthread_cond_wait时,如果条件不成立我们就进入阻塞,但是进入阻塞这个期间,如果条件变量改变了的话,那我们就漏掉了这个条件。因为这个线程还没有放到等待队列上,所以调用pthread_cond_wait前要先锁互斥量,即调用pthread_mutex_lock(),pthread_cond_wait在把线程放进阻塞队列后,自动对mutex进行解锁,使得其它线程可以获得加锁的权利。这样其它线程才能对临界资源进行访问并在适当的时候唤醒这个阻塞的进程。当pthread_cond_wait返回的时候又自动给mutex加锁。

总的来说就是解决线程“进入阻塞”这段期间,条件变量不发生改变。

pthread_cond_init 初始化条件变量

int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);

pthread_cond_wait 等待条件变量

int pthread_cond_wait(pthread_cond_t *cv,pthread_mutex_t *mutex);

pthread_cond_timedwait 等待条件变量到指定时间

int pthread_cond_timedwait(pthread_cond_t *cv,pthread_mutex_t *mp, const structtimespec * abstime);

pthread_cond_signal 通知等待条件变量的单个线程

int pthread_cond_signal(pthread_cond_t *cv);