Cli*_*ung 3 c++ mfc multithreading wait waitforsingleobject
我想了解线程上的“等待”实际上是如何工作的?幕后是否存在无限循环(听起来不合理)?
例如,在 MSDN/MFC 手册页的“WaitForSingleObject”函数中,它说
WaitForSingleObject 函数检查指定对象的当前状态。如果对象的状态为无信号状态,则调用线程将进入等待状态,直到对象收到信号信号或超时间隔已过。 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx)
这个“等待状态”是什么?线程如何“唤醒”,即事件或对象信号如何导致线程再次运行?谁检查同步对象以及多久检查一次?
谢谢
这是由操作系统线程调度程序处理的。
当线程等待某件事时,操作系统会创建一个从它正在等待的对象到正在等待的对象的链接。当正在等待的对象的状态发生变化时,调度程序会查看正在等待的对象。如果状态更改解除了其中任何一个的阻塞,那么它将它们标记为解除阻塞,因此它们有资格进行调度。
然后,调度程序使用算法来选择哪些符合调度条件的线程实际上将被调度运行。确切的细节在操作系统之间(甚至在同一操作系统的版本之间)有所不同,但根据您的要求,我猜您现在可能不太关心这一点。
最重要的是,一旦线程像这样阻塞,(实际上)就不会花费 CPU 时间来查看它是否可以再次运行。它不是遍历所有被阻止的线程,并查看情况是否发生变化以便其中任何一个线程可以运行,而是只查看情况的变化,当这些变化发生时,它会找出允许运行的线程。
当然,至少在理论上,某些操作系统的工作方式也可能与此不同,但 Windows 的工作方式确实与上述非常相似,并且大多数其他典型系统(例如 Linux、*BSD、MacOS)在以下方面非常相似:这个尊重。
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |