请关注我的微信公众号
个人微信公众号
技术交流群 (仅作技术交流):642646237
请关注我的头条号:
并发编程经常需要等待某个事件发生。
条件变量就是为这种情况而设计的。
使用条件变量的模式
一个条件变量需要与一把锁关联,线程在开始等待条件之前必须获取这把锁。
获取锁后,线程检查所等待的条件是否已经为真。如果条件为真,线程将解锁并继续执行。
如果所等待的条件不为真,线程会调用await()
,它将原子地解锁并阻塞等待该条件。
当另一个线程调用了signal()
或signalAll()
,意味着对应的条件可能变为真,await()
将原子地恢复运行并重新加锁。
需要注意的是当await()
函数返回时,只意味着等待的条件可能为真。这就是为什么要在一个循环中调用await()的原因——从await()
返回后,需要重新检查等待的条件是否为真,必要的话可能再次调用await()
并阻塞。
条件模式解决哲学家问题
将竞争从对筷子的争夺转换成了对状态的判断:仅当哲学家的左右邻座都没有进餐时,他才可以进餐。
其他解决方案中,经常出现的状况是只有一个哲学家能进餐,因为其他人都持有一根筷子并在等待另外一根。
网友评论