【问题标题】:Does the signaled state of a CONDITIONAL_VARIABLE persist even when there are no threads waiting for this signal?即使没有线程等待此信号,CONDITIONAL_VARIABLE 的信号状态是否仍然存在?
【发布时间】:2016-12-12 19:13:45
【问题描述】:

在 Pthreads 中,如果一个条件变量被发出信号并且没有线程阻塞在 pthread_cond_wait() 上,那么这个信号就会丢失。

当您在 Windows 中使用 SetEvent() 发出事件信号时,此事件将保持信号状态,直到另一个线程等待此事件对象。

使用WakeConditionVariable() 发出信号的 CONDITIONAL_VARIABLE 遵循上述哪些行为?

【问题讨论】:

  • 没关系,因为intended usage pattern是在等待之前验证条件。如果条件变量在没有服务员的情况下被唤醒,那么下一个服务员会验证条件,看是否满足,从不首先调用SleepConditionVariable

标签: windows multithreading winapi


【解决方案1】:

这是一个未记录的实现细节,可能会发生变化。因此,您的代码必须在任何一种情况下都能正常运行。正如 Raymond 已经指出的那样,如果您 use condition variables as intended, 这会自动发生。

如果由于某种原因您没有使用通常的模式,您应该假设唤醒将丢失,但请记住,等待条件变量的线程可能随时因任何原因被唤醒,也可能没有:

条件变量会受到虚假唤醒(与显式唤醒无关)的影响

这意味着,如果您假设唤醒已丢失,但实际上并没有,那么就代码而言,它只是看起来像是虚假唤醒。只要代码正确处理虚假唤醒,它也能正确处理这种情况。

【讨论】:

    【解决方案2】:

    来自MSDN上的以下句子(https://msdn.microsoft.com/en-us/library/windows/desktop/ms687080(v=vs.85).aspx

    唤醒一个线程类似于设置一个自动重置事件,同时唤醒所有线程 线程类似于脉冲手动重置事件,但更可靠(请参阅 PulseEvent 了解详情)。

    我推断该行为与 pthread 库中的行为相同。但正如上面评论中所说,如果您打算以标准方式使用条件变量,这方面实际上并不重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      相关资源
      最近更新 更多