2

我想了解线程上的“等待”实际上是如何工作的?幕后是否有无限循环(听起来不合理)?

例如,在“WaitForSingleObject”功能的 MSDN/MFC 手册页中,它说

WaitForSingleObject 函数检查指定对象的当前状态。如果对象的状态是无信号的,则调用线程进入等待状态,直到对象发出信号或超时间隔过去。http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx

这个“等待状态”是什么?线程是如何“唤醒”的,即一个事件的上升或一个对象的信号如何导致线程再次运行?谁检查同步对象以及多久检查一次?

谢谢

4

1 回答 1

4

这由操作系统线程调度程序处理。

当线程等待某事时,操作系统会创建一个从它正在等待的对象返回到等待对象的链接。当正在等待的对象的状态发生变化时,调度程序会查看正在等待它的对象。如果状态更改取消阻止其中任何一个,则它将它们标记为未阻止,因此它们有资格进行调度。

然后调度程序有算法来选择哪些线程有资格被调度实际被调度运行。操作系统之间(甚至同一操作系统的版本之间)的确切细节会发生变化,但根据您的要求,我猜您现在可能不太关心这一点。

底线是,一旦一个线程像这样阻塞,(实际上)没有 CPU 时间用于查看它是否可以再次运行。它不是遍历所有被阻塞的线程,而是查看情况是否发生了变化,以便它们中的任何一个都可以运行,它只查看情况的变化,当这些变化发生时,它会确定哪些线程将允许运行。

当然,也有可能至少在理论上,某些操作系统的工作方式可能与此不同——但 Windows 确实可以正常工作,并且大多数其他典型系统(例如,Linux、*BSD、MacOS)在这方面。

于 2014-06-08T20:35:02.983 回答