0

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

4

2 回答 2

2

从概念上讲,信号量相当于互斥体、条件变量和受互斥体保护的整数计数器。在这个类比下,发布一个信号量相当于锁定互斥锁、递增计数器、发送条件变量信号和解锁互斥锁。即使没有服务员,状态仍然会被修改。

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

  1. 锁定互斥锁。
  2. 当计数为非正数时,等待条件变量。
  3. 递减计数。
  4. 解锁互斥锁。

当然,如果您谈论的是 POSIX 的特定情况,那么类比并不完全符合实际情况,因为信号量具有额外的异步信号安全属性,这些属性妨碍使用 mutex/condvar/count 三元组来实现它们。

于 2012-12-11T23:47:50.890 回答
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

相应地,每当与条件变量关联的条件更新时,都必须在持有互斥锁的同时进行。这样,在条件变量上阻塞时,在系统准备好实际解除阻塞等待线程之前,条件不会改变。

于 2012-12-11T23:46:58.183 回答