在阅读一本关于并发的书时,作者说信号量与 signal() 工作方式中的条件变量不同。信号量会跟踪对 signal() 的调用次数,而条件变量则不会。“在没有人等待的情况下调用 pthread_cond_signal 无效”,它说。为什么这个细节很重要(我已经看到它在不同的地方重复了很多次)?对使用有什么影响?谢谢
问问题
848 次
2 回答
2
从概念上讲,信号量相当于互斥体、条件变量和受互斥体保护的整数计数器。在这个类比下,发布一个信号量相当于锁定互斥锁、递增计数器、发送条件变量信号和解锁互斥锁。即使没有服务员,状态仍然会被修改。
在这个类比下,信号量的服务员正在做相当于:
- 锁定互斥锁。
- 当计数为非正数时,等待条件变量。
- 递减计数。
- 解锁互斥锁。
当然,如果您谈论的是 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 回答