1

我不确定。

例如,当我在 C++ 中使用critical_section/mutex/semaphor 时,如何防止busy_wait 问题?

我的意思是当一个线程到达临界区并且临界区被其他线程占用时,是什么阻止线程浪费循环时间并且什么也不等待?

例如,我应该调用 TryEnterCriticalSection 并检查线程是否获得所有权,否则调用 sleep(0) 吗?

我有点困惑

谢谢

4

3 回答 3

3

这是特定于 Windows 的,但 Linux 将是类似的。

Windows 有线程就绪队列的概念。这些是准备好运行的线程,将在某个时间点在可用处理器上运行。选择哪些线程立即运行有点复杂 - 线程可以有不同的优先级,它们的优先级可以暂时提升,等等。

当线程等待 CRITICAL_SECTION 或互斥锁等同步原语时,它不会被放置在就绪队列中 - Windows 甚至不会尝试运行该线程,并且会在可能的情况下运行其他线程。在某些时候,线程将被移回就绪队列,例如当拥有 CS 或互斥体的线程释放它时。

于 2009-11-20T20:44:49.260 回答
1

该线程不会占用任何系统资源,因为它将被标记为“等待”。一旦占据临界区的线程完成,它就会发出一个信号,将等待线程移动到就绪队列。

于 2009-11-20T20:44:19.900 回答
0

这些控制结构通过允许无法进入的线程进入休眠状态来阻止它进行忙碌等待,直到处于临界区完成执行的线程产生中断为止。因为线程处于睡眠状态,它没有使用处理器周期,所以没有busy_wait。

于 2009-11-20T20:41:34.523 回答