C++唤醒睡眠线程



关于如何从另一个线程唤醒一个正在休眠的线程,或者如何让一个线程在收到指令之前一直处于休眠状态,已经有很多问题和答案了(附录a(,但我的问题更具体地说是关于引擎盖下实际发生了什么。

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

我提到的另一种方法是使用互斥锁。让线程尝试锁定一个锁定的互斥体,它会休眠,然后在互斥体被其原始锁定器解锁时神奇地醒来。但这不就是在做同样的事情吗?也就是说,先睡x段时间,然后每隔一段时间醒来检查一下它是否还锁着?

有没有什么唤醒功能不需要按设定的时间间隔睡觉?就像某种操作系统级别的推送?例如,操作系统必须跟踪何时需要唤醒休眠线程,对吧?因此,在理论中,如果你能把这个数字改为0或1,那么它会更快醒来。这是有道理的。

我之所以这么问,是因为唤醒所需的时间和使用的资源量之间存在权衡。它在两次检查之间睡眠的时间越长,响应就越慢,等待的时间越短,它在检查应用程序的另一部分已经知道没有更改的内容时浪费的周期就越多。似乎效率低下。

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

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

你不需要设置较低的暂停时间就可以快速唤醒。

但这不是在幕后做同样的事情吗?也就是说,先睡x段时间,然后每隔一段时间醒来检查一下它是否还锁着?

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

最新更新