相信大家对条件变量与互斥锁都有一些了解,那么,条件变量与互斥锁为什么要一起使用呢?动力节点小编来告诉大家。
函数pthread_cond_wait()有几步操作:
判断条件,如果条件满足,继续执行;
如果条件不满足,就将线程挂到条件变量的等待线程队列中。
如果不加锁的话,这两步之间就可能存在时间窗口,也就是(1)当线程1判断条件不满足,(2)然后准备把线程挂起的时候,线程2改变了条件,(3)接着线程1挂在了条件变量的等待队列上,这样就可能死锁。
如果加上锁,这种时间窗口就会消除,使pthread_cond_wait的操作变成原子操作。pthread_cond_wait的第二个参数是一个加了锁的互斥量,这样可以避免线程在判断条件变量以及挂起的时候被别的线程改变条件。如果线程被挂起,pthread_cond_wait里面会解锁,是为了让别的线程来改变条件变量(别的线程在改变条件变量的时候,必须加锁,也是为了防止竞争)。但是从phread_cond_wait返回的时候,互斥量要再次被锁住。
总的来说,互斥锁就是用来保护条件变量的,因为有一些操作不是原子操作,存在竞争。
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(并给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。
锁的目的很明确,使线程们互斥地访问某个东西(变量、代码段)。它只有两个状态(被持有,未被持有)
通过上述介绍,相信大家对条件变量与互斥锁要一起使用的原因已经有所了解,想了解更多可查看Java多线程编程技术文档,对大家的学习一定会有所帮助的。
到此这篇条件变量 互斥锁(条件变量为什么要和锁一起用)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/52484.html