条件变量与互斥锁要一起使用的原因 - 极悦
首页 课程 师资 教程 报名

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

  • 2022-09-02 10:59:51
  • 1614次 极悦

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

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

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

函数pthread_cond_wait()有几步操作:

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

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

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

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

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

条件变量

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

互斥锁

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

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

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交