【发布时间】:2021-03-22 12:29:57
【问题描述】:
关于如何从另一个线程唤醒休眠线程或如何让线程休眠直到它接收到指令(同样的事情,但从另一个方向描述),已经有大量的问题和答案 (Exhibit A),但是我的问题更具体地说是关于幕后实际发生的事情。
唯一的方法是让线程自己选择休眠然后检查它的队列,或者当它唤醒时检查某个变量,然后再次休眠?
我见过的另一种方法是使用互斥体。让线程尝试锁定一个锁定的互斥锁,它会休眠,然后当互斥锁被其原始锁解锁时神奇地唤醒。但这不就是在幕后做同样的事情吗? IE。睡 x 段时间,然后每隔一段时间醒来检查它是否仍然锁定?
是否有任何类型的唤醒功能不需要在设定的时间间隔内休眠?像某种操作系统级别的推送?例如,操作系统必须跟踪何时需要唤醒睡眠线程,对吗?所以在理论上,如果你可以将该数字更改为 0 或 1,那么它会更快地醒来。这是有道理的。
我之所以这么问,是因为在唤醒需要多长时间和它使用的资源量之间需要权衡取舍。它在检查之间休眠的时间越长,响应就越慢,它等待的时间越短,它浪费的周期就越多,它浪费在检查应用程序的另一部分已经知道没有改变的东西上。似乎效率低下。
【问题讨论】:
-
您没有提到平台,所以我不知道您可以使用哪些同步原语,但在 Windows 上,我通常在这种情况下使用
event。您可以等待具有超时的事件。如果事件未发出信号,则类似于Sleep,但您可以随时通过设置将其唤醒。 -
不同方法在后台的具体工作方式取决于操作系统和实现。你需要更具体。
-
C++20 有
std::latch可能在这里有用,但老实说,不知道它在幕后做了什么。 -
经典解决方案:信号量。
-
'要睡 x 一段时间,然后每隔一段时间醒来检查它是否仍然被锁定?'不,这不是被阻塞的线程被解除阻塞的方式!
标签: c++ multithreading