我想了解等待'在一个线程上实际上工作? 场景背后是否有无限循环(听起来不合理)?
例如,在MSDN / MFC手册页中,对于' WaitForSingleObject'功能它说
WaitForSingleObject函数检查指定对象的当前状态。如果对象的状态是非信号状态,则调用线程进入等待状态,直到对象发出信号或超时间隔过去。 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx)
这是什么"等待状态"? 线程如何唤醒'如何升级事件或签署对象会导致线程再次运行? 谁检查同步对象以及频率?
谢谢
答案 0 :(得分:3)
这由OS线程调度程序处理。
当一个线程等待某个东西时,操作系统会从它等待的等待对象创建一个链接。当等待的对象的状态发生更改时,调度程序会查看正在等待它的对象。如果状态更改解除阻止其中任何一个,那么它会将其标记为未阻止,因此它们有资格进行计划。
然后,调度程序具有算法,用于选择实际计划运行哪些符合调度条件的线程。操作系统之间(甚至是相同操作系统版本之间)的确切细节也会发生变化,但根据您的要求,我猜你现在可能并不关心它。
最重要的是,一旦线程像这样阻塞,(实际上)没有花费CPU时间来查看它是否可以再次运行。它不是通过所有被阻塞的线程,并查看情况是否已经发生变化,因此它们中的任何一个都可以运行,它只会查看情况的变化,当这些情况发生时,它会找出允许运行的线程。
当然,至少在理论上,某些操作系统可以以不同的方式工作,这也是可能的 - 但Windows绝对可以像上面描述的那样工作,而且大多数其他典型的系统(例如,Linux,* BSD,MacOS)在这方面非常相似。