gpt4 book ai didi

c++ - 线程上的 'wait' 如何在 C++ 中实际工作

转载 作者:搜寻专家 更新时间:2023-10-31 01:44:03 25 4
gpt4 key购买 nike

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

例如在 MSDN/MFC 的“WaitForSingleObject”函数手册页中它说

The WaitForSingleObject function checks the current state of the specified object. If the object's state is nonsignaled, the calling thread enters the wait state until the object is signaled or the time-out interval elapses. (http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx)

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

谢谢

最佳答案

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

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

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

底线是,一旦线程像这样阻塞,(实际上)不会花费 CPU 时间来查看它是否可以再次运行。它不是遍历所有被阻塞的线程,并查看情况是否发生变化以便其中任何一个线程可以运行,而是仅查看情况的变化,并在发生这些变化时找出允许运行的线程。

当然,也有可能至少在理论上某些操作系统可以以不同的方式工作——但 Windows 确实可以像上面描述的那样工作,而大多数其他典型系统(例如 Linux , *BSD, MacOS) 在这方面非常相似。

关于c++ - 线程上的 'wait' 如何在 C++ 中实际工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24110481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com