更新时间:2022-09-02 10:59:51 来源:极悦 浏览1400次
相信大家对条件变量与互斥锁都有一些了解,那么,条件变量与互斥锁为什么要一起使用呢?极悦小编来告诉大家。
函数pthread_cond_wait()有几步操作:
判断条件,如果条件满足,继续执行;
如果条件不满足,就将线程挂到条件变量的等待线程队列中。
如果不加锁的话,这两步之间就可能存在时间窗口,也就是(1)当线程1判断条件不满足,(2)然后准备把线程挂起的时候,线程2改变了条件,(3)接着线程1挂在了条件变量的等待队列上,这样就可能死锁。
如果加上锁,这种时间窗口就会消除,使pthread_cond_wait的操作变成原子操作。pthread_cond_wait的第二个参数是一个加了锁的互斥量,这样可以避免线程在判断条件变量以及挂起的时候被别的线程改变条件。如果线程被挂起,pthread_cond_wait里面会解锁,是为了让别的线程来改变条件变量(别的线程在改变条件变量的时候,必须加锁,也是为了防止竞争)。但是从phread_cond_wait返回的时候,互斥量要再次被锁住。
总的来说,互斥锁就是用来保护条件变量的,因为有一些操作不是原子操作,存在竞争。
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(并给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。
锁的目的很明确,使线程们互斥地访问某个东西(变量、代码段)。它只有两个状态(被持有,未被持有)
通过上述介绍,相信大家对条件变量与互斥锁要一起使用的原因已经有所了解,想了解更多可查看Java多线程编程技术文档,对大家的学习一定会有所帮助的。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习