哪些条件变量可以做而unlock+yield不能做?

问题描述 投票:0回答:1

在 POSIX 中,要求当对条件变量和互斥体调用

wait
时,两个操作 - 解锁互斥体和阻塞线程,以原子方式执行,这样任何
broadcast
/
signal 
应该像它们发生在 之后 阻塞一样生效。我想 C11、C++ 条件变量也应该有等效的要求,我不会继续进行详细的枚举。

但是,在某些系统中(比如很多人怀念的WinXP),并没有条件变量机制。相反,他们必须执行

unlock
+
yield
才能达到类似(相同?)的效果。这是有效的,因为即使
broadcast
/
signal
发生在
unlock
yield
之间,当重新调度线程时,其可观察的行为与唤醒发生在块之后相同。 WinXP 支持互斥锁,并且它有一个
SleepEx
函数,可以像
yield
一样工作。

所以这就引出了一个问题:哪些条件变量可以做,而

unlock
+
yield
不能做?


回应评论:我以WinXP为例,因为它恰好是支持mutex但不支持condvar的,而且它是一代内存。当然,我们假设正确性和合理的性能,并且该问题并没有专门询问 Windows,而是询问一般的任何实现

mutex sleep condition-variable
1个回答
0
投票

CV 可以进行定时等待,而你无法控制何时从收益中醒来。

POSIX 标准中的 CV 可以等到绝对时间点过去。它不是相对的原因是

  1. 如果你想等待绝对时间
  2. 你必须倒着计算才能计算出相对时间,并且
  3. 如果线程在计算和 CV 等待之间被抢占,
  4. 实际的唤醒可能会延迟。
© www.soinside.com 2019 - 2024. All rights reserved.