std::condition_variable::wait是如何实现的?
How is std::condition_variable::wait implemented?
我试图搜索 std::conidition_variable::wait
在我本地机器上的标准库中是如何实现的,我可以看到 wait_unitl
但找不到 wait
.
我的问题是,wait
函数是如何在内部实现的,如何使线程无限期休眠,它是使用长时间休眠还是完全不同的 OS-特定的东西?
谢谢!
抢占式多线程是一个主要由操作系统控制的进程。它决定哪些线程将时间片 and/or 分配给哪些内核,等等。因此,对于大多数低级线程原语(互斥体、条件变量等),真正的工作是在 OS 调用中完成的。
是的,您可以理论上实现一些东西,比如一个条件变量,只不过是原子访问和定时线程挂起。但是,它的性能会非常差。现代 OS 知道线程何时等待某个条件,并且可以在条件满足时唤醒该线程 "immediately"。您的机制要求等待线程等到某个特定时间过去。
另外,您将有一大堆必须检查的虚假唤醒,因此无缘无故地使用了线程时间。基于 OS 的实现将有更少的虚假唤醒。
我试图搜索 std::conidition_variable::wait
在我本地机器上的标准库中是如何实现的,我可以看到 wait_unitl
但找不到 wait
.
我的问题是,wait
函数是如何在内部实现的,如何使线程无限期休眠,它是使用长时间休眠还是完全不同的 OS-特定的东西?
谢谢!
抢占式多线程是一个主要由操作系统控制的进程。它决定哪些线程将时间片 and/or 分配给哪些内核,等等。因此,对于大多数低级线程原语(互斥体、条件变量等),真正的工作是在 OS 调用中完成的。
是的,您可以理论上实现一些东西,比如一个条件变量,只不过是原子访问和定时线程挂起。但是,它的性能会非常差。现代 OS 知道线程何时等待某个条件,并且可以在条件满足时唤醒该线程 "immediately"。您的机制要求等待线程等到某个特定时间过去。
另外,您将有一大堆必须检查的虚假唤醒,因此无缘无故地使用了线程时间。基于 OS 的实现将有更少的虚假唤醒。