12

我正在实现条件等待,信号量或条件变量都可以用来实现它。两者有什么区别吗?更具体地说,从性能的角度来看?

我听说当一个线程等待一个条件变量时,它不会被调度,直到它发出信号。这确保它不会消耗 CPU 周期。但这对于信号量来说不是这样,即使它正在等待,信号量也会消耗 CPU 周期?

4

3 回答 3

19

如果您的所有线程都在等待某个事件,例如提交任务,那么您可以通过在事件上使用条件变量将它们全部唤醒。

如果您的资源有限,例如为您的线程保留的 10 页内存,那么您将需要它们等待,直到一个页面可用。发生这种情况时,您只需要让一个线程开始执行。在这种情况下,您可以使用信号量解锁与可用页面一样多的线程。

于 2012-07-27T04:26:30.273 回答
3

信号量有额外的状态——持有的单位计数——以及等待它的线程的队列,因此允许信号量记录它被发出信号的次数,即使当前没有线程在等待它。如果线程围绕信号量 wait() 循环并且信号量被发出 N 次信号,则线程最终将循环 N 次,即使在发出信号时线程有时很忙——这对于生产者-消费者队列非常有用。

condvar 没有这种额外的计数状态,但它可以释放它所绑定的锁,直到线程发出信号为止——这对于生产者-消费者队列非常有用。

有时,我希望将两者结合起来 - 一个带有计数的 condvar,但这似乎不会从操作系统开发人员那里得到:(

信号量和 condvar 的相同之处在于它们都是同步原语。除此之外..

于 2012-07-27T09:31:16.743 回答
0

条件变量和二进制信号量都阻塞线程,直到指定的信号条件为 true ,并且两者都是相同的,您可以使用任何一个,但条件变量始终与 mutex 一起使用。在这两种情况下,您只能通过信号进行安排,没有它您无法安排。但是如果要在这种情况下保持资源数量,请使用计数信号量。使用互斥锁时,两者都不会消耗 cpu。

于 2016-02-24T10:48:43.237 回答