我不确定。
例如,当我在c ++中使用critical_section / mutex / semaphor时,busy_wait问题是如何被阻止的?
我的意思是当一个线程到达一个临界区并且临界区被其他线程占用时,是什么阻止线程浪费周期时间而不等待什么?
例如,我应该调用TryEnterCriticalSection并检查线程是否获得所有权,否则调用sleep(0)?
我有点困惑
感谢
答案 0 :(得分:3)
这是Windows特定的,但Linux将是类似的。
Windows具有准备好的线程队列的概念。这些线程已准备好运行,并将在可用处理器上的某个点运行。选择哪个线程立即运行有点复杂 - 线程可以有不同的优先级,它们的优先级可以暂时提升等等。
当线程等待CRITICAL_SECTION或互斥锁等同步原语时,它不会放在就绪队列中 - Windows甚至不会尝试运行该线程,并且如果可能的话也会运行其他线程。在某些时候,线程将被移回准备队列,例如当拥有CS或互斥锁的线程释放它时。
答案 1 :(得分:1)
该线程不会占用任何系统资源,因为它将被标记为“等待”。一旦占用关键区域的线程完成,它将发出一个信号,将等待线程移动到就绪队列。
答案 2 :(得分:0)
这些控制结构通过允许它进入休眠状态来停止无法进入繁忙等待的线程,直到关键部分完成执行中的线程生成中断为止。因为线程处于睡眠状态,所以它不使用处理器周期,因此没有busy_wait。