在 POSIX 中,要求当对条件变量和互斥体调用
wait
时,两个操作 - 解锁互斥体和阻塞线程,以原子方式执行,这样任何 broadcast
/signal
应该像它们发生在 之后 阻塞一样生效。我想 C11、C++ 条件变量也应该有等效的要求,我不会继续进行详细的枚举。
但是,在某些系统中(比如很多人怀念的WinXP),并没有条件变量机制。相反,他们必须执行
unlock
+yield
才能达到类似(相同?)的效果。这是有效的,因为即使 broadcast
/signal
发生在 unlock
和 yield
之间,当重新调度线程时,其可观察的行为与唤醒发生在块之后相同。 WinXP 支持互斥锁,并且它有一个 SleepEx
函数,可以像 yield
一样工作。
所以这就引出了一个问题:哪些条件变量可以做,而
unlock
+yield
不能做?
回应评论:我以WinXP为例,因为它恰好是支持mutex但不支持condvar的,而且它是一代内存。当然,我们假设正确性和合理的性能,并且该问题并没有专门询问 Windows,而是询问一般的任何实现。
CV 可以进行定时等待,而你无法控制何时从收益中醒来。
POSIX 标准中的 CV 可以等到绝对时间点过去。它不是相对的原因是