【问题标题】:Significance of signalling a condition variable when no one is waiting?没有人在等待时发出条件变量信号的意义?
【发布时间】:2012-12-11 23:37:32
【问题描述】:

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

【问题讨论】:

标签: c concurrency semaphore condition-variable


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢。当您说 pthread 信号量具有“异步信号属性”时,您的意思是如果有 2 个线程,一个调用 signal() 和一个 wait() 同时,pthread 会阻止在等待之前调用 signal() ()?
  • 没有。我的意思是 sem_post 被指定为异步信号安全的。这意味着您始终可以从信号处理程序中调用它,即使在信号中断时同一线程处于sem_postsem_wait 中间的最坏情况下,它也会按预期运行。
【解决方案2】:

这意味着您必须有一个与条件变量相关联的“条件”。您必须使用条件变量的方式是:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多