在Pthreads中,如果发出条件变量并且pthread_cond_wait()
上没有线程阻塞,则此信号将丢失。
当您使用SetEvent()在Windows中发出事件信号时,此事件将保持信号状态,直到另一个线程等待此事件对象。
以上哪种行为使用WakeConditionVariable()发出CONDITIONAL_VARIABLE信号?
答案 0 :(得分:1)
这是一份未记录的实施细节,可能会有所变化。因此,在任何一种情况下,您的代码必须才能正常运行。正如Raymond已经指出的那样,如果你use condition variables as intended,这会自动发生。
如果由于某种原因你没有使用通常的模式,你应该假设唤醒将会丢失,但是请记住等待条件变量的线程可能因任何原因随时被唤醒:
条件变量受到虚假唤醒(与显式唤醒无关的那些)
这意味着如果你假设唤醒丢失了,但事实上它并不是,就代码而言,它看起来就像一个虚假的唤醒。如果代码正确处理虚假唤醒,它也将正确处理这种情况。
答案 1 :(得分:0)
来自MSDN上的以下句子(https://msdn.microsoft.com/en-us/library/windows/desktop/ms687080(v=vs.85).aspx)
唤醒一个线程类似于设置自动重置事件,同时唤醒所有线程 螺纹类似于脉冲手动复位事件但更可靠(参见 PulseEvent了解详情。)
我推断出行为与pthread库中的行为相同。但正如上面的评论中所述,如果您计划以标准方式使用条件变量,这方面实际上并不重要。