说到条件变量,首先说下互斥锁,互斥锁是最一种同步形式,用于保护临界区,以保证任何时刻只有一个线程在执行其中的代码(假设互斥锁由多个线程共享),来保证共享数据的完整性,上锁过程如下图;
假如在一个程序中由3个线程访问一个共享变量g_Count,其中线程1和线程是负责对g_Count变量加一,线程3是负责对g_Count变量减一;线程4是负责判断g_Count是否大于等于100,是就将变量g_Count清零,代码片段如下:
上面这段代码中的线程4并不知变量g_Count什么时候才会大于等于100,这就需要一直的循环判断,但是每次的判断都有上锁和解锁的操作(上锁和操作是很费时的),这会带来CPU资源浪费;对于这个问题可以使用条件变量处理;
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号);为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起;
条件变量是由互斥锁保护的,线程在改变条件状态前必须先锁住互斥锁,其他线程在获得互斥量之前不会察觉到这种改变,因为必须锁定互斥锁才能计算条件;

将之前的代码使用条件变量修改:
在《UNIX环境高级编程》中,有这么一段:
;所以上面这段代码中的线程3如果g_Count小于100,线程3会调用pthread_cond_wait,而pthread_cond_wait会释放mutex,然后等待条件变为真返回,pthread_cond_wait返回时会再次锁住mutex;条件不满足时pthread_cond_wait会等待,从而不用一直的轮询,减少CPU的浪费;
至于上面的代码中的使用while的原因,在多核处理器下,pthread_cond_signal可能会激活多于一个线程(阻塞在条件变量上的线程);结果就是,当一个线程调用pthread_cond_signal()后,多个调用pthread_cond_wait()或pthread_cond_timedwait()的线程返回;这种效应就称为“虚假唤醒”;
在pthread_cond_wait的man手册中,对虚假唤醒有这样一段话:
![]()
需要对条件进行再判断以避免虚假唤醒:


参考:
https://blog.csdn.net/leeds1993/article/details/
https://www.ibm.com/developerworks/cn/linux/thread/posix_thread3/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/138538.html