专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 条件变量与互斥锁要一起使用的原因

条件变量与互斥锁要一起使用的原因

更新时间:2022-09-02 10:59:51 来源:动力节点 浏览1239次

相信大家对条件变量与互斥锁都有一些了解,那么,条件变量与互斥锁为什么要一起使用呢?动力节点小编来告诉大家。

条件变量与互斥锁要一起使用的原因

条件变量为什么要和互斥锁一起使用?

函数pthread_cond_wait()有几步操作:

判断条件,如果条件满足,继续执行;

如果条件不满足,就将线程挂到条件变量的等待线程队列中。

如果不加锁的话,这两步之间就可能存在时间窗口,也就是(1)当线程1判断条件不满足,(2)然后准备把线程挂起的时候,线程2改变了条件,(3)接着线程1挂在了条件变量的等待队列上,这样就可能死锁。

如果加上锁,这种时间窗口就会消除,使pthread_cond_wait的操作变成原子操作。pthread_cond_wait的第二个参数是一个加了锁的互斥量,这样可以避免线程在判断条件变量以及挂起的时候被别的线程改变条件。如果线程被挂起,pthread_cond_wait里面会解锁,是为了让别的线程来改变条件变量(别的线程在改变条件变量的时候,必须加锁,也是为了防止竞争)。但是从phread_cond_wait返回的时候,互斥量要再次被锁住。

总的来说,互斥锁就是用来保护条件变量的,因为有一些操作不是原子操作,存在竞争。

条件变量

条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(并给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。

互斥锁

锁的目的很明确,使线程们互斥地访问某个东西(变量、代码段)。它只有两个状态(被持有,未被持有)

通过上述介绍,相信大家对条件变量与互斥锁要一起使用的原因已经有所了解,想了解更多可查看Java多线程编程技术文档,对大家的学习一定会有所帮助的。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>