没有人在等待时发出条件变量的重要性?

时间:2012-12-11 23:37:32

标签: c concurrency semaphore condition-variable

在阅读有关并发的书时,作者说信号量与signal()的工作方式不同于条件变量。信号量跟踪signal()的调用次数,而条件变量则没有。 “没有人在等待时调用pthread_cond_signal没有效果”,它说。为什么这个细节很重要(我在不同的地方看过很多次)?对使用有什么影响?谢谢

2 个答案:

答案 0 :(得分:2)

从概念上讲,信号量相当于互斥锁保护的互斥锁,条件变量和整数计数器。根据这个类比,发布信号量相当于锁定互斥锁,递增计数器,发出条件变量信号,以及解锁互斥锁。即使没有服务员,州仍然会被修改。

根据这个类比,信号量的服务员正在做相当于:

  1. 锁定互斥锁。
  2. 虽然计数是非正数,但等待条件变量。
  3. 减少数量。
  4. 解锁互斥锁。
  5. 当然,如果您正在谈论POSIX的具体情况,那么这个类比并不完全符合现实,因为信号量具有额外的异步信号安全属性,无法使用互斥/ condvar / count三元组来实现它们。

答案 1 :(得分:1)

其含义是您必须具有与条件变量相关联的“条件”。您必须使用条件变量的方式是:

acquire the condition's mutex

while (!condition) {
     wait on the condition variable
}

do whatever you need to do while holding the mutex

release the mutex

相应地,每当更新与条件变量相关的条件时,必须在保持互斥锁的同时完成。这样,当阻塞条件变量时,在系统准备实际解除对等待线程的阻塞之前,条件不能改变。

相关问题