繁体   English   中英

C++ 唤醒一个休眠线程?

[英]C++ Wake up a sleeping thread?

关于如何从另一个线程中唤醒一个正在休眠的线程或如何让一个线程休眠直到它收到一条指令(同样的事情,但从另一个方向描述),已经有很多问题和答案( 图表 A ),但我的问题更多特别是关于幕后实际发生的事情。

这样做的唯一方法是让线程自己选择休眠然后检查它的队列,或者当它醒来时某个地方的某个变量,然后再次休眠?

我见过的另一种方法是使用互斥锁。 让线程尝试锁定一个锁定的互斥锁,它会休眠,然后当互斥锁被其原始锁解锁时神奇地唤醒。 但这不就是在幕后做同样的事情吗? 即要睡x一段时间,然后每隔一段时间醒来检查它是否仍然锁定?

是否有任何类型的唤醒功能不需要在设定的时间间隔内休眠? 像某种操作系统级别的推送? 例如,操作系统必须跟踪何时需要唤醒睡眠线程,对吗? 所以理论上如果你能把这个数字改成 0 或 1,那么它会更快醒来。 那讲得通。

我问的原因是因为在唤醒需要多长时间和它使用的资源量之间需要权衡。 它在检查之间休眠的时间越长,响应就越慢,它等待的时间越短,它浪费的周期就越多,它浪费在检查应用程序的另一部分已经知道没有改变的东西上。 似乎效率低下。

您误解了条件变量。 此答案中第一个示例中的线程将在 1000 秒后或通知条件变量时唤醒。 没有权衡。

同样,等待具有 1000 秒超时时间的互斥锁的线程将在 1000 秒后唤醒,或者当互斥锁可用并且线程获取它时唤醒。

您不必设置低超时来获得快速唤醒。

但这不就是在幕后做同样的事情吗? 即要睡x一段时间,然后每隔一段时间醒来检查它是否仍然锁定?

不,不是。 它告诉操作系统在解锁时或 1000 秒后唤醒它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM