【问题标题】:C++ Wake up a sleeping thread?C ++唤醒一个睡眠线程?
【发布时间】:2021-03-22 12:29:57
【问题描述】:

关于如何从另一个线程唤醒休眠线程或如何让线程休眠直到它接收到指令(同样的事情,但从另一个方向描述),已经有大量的问题和答案 (Exhibit A),但是我的问题更具体地说是关于幕后实际发生的事情。

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

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

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

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

【问题讨论】:

  • 您没有提到平台,所以我不知道您可以使用哪些同步原语,但在 Windows 上,我通常在这种情况下使用 event。您可以等待具有超时的事件。如果事件未发出信号,则类似于Sleep,但您可以随时通过设置将其唤醒。
  • 不同方法在后台的具体工作方式取决于操作系统和实现。你需要更具体。
  • C++20 有 std::latch 可能在这里有用,但老实说,不知道它在幕后做了什么。
  • 经典解决方案:信号量。
  • '要睡 x 一段时间,然后每隔一段时间醒来检查它是否仍然被锁定?'不,这不是被阻塞的线程被解除阻塞的方式!

标签: c++ multithreading


【解决方案1】:

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

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

您无需设置较低的超时时间即可快速唤醒。

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

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

【讨论】:

  • 好的。 如何告诉操作系统唤醒它?
  • @Alasdair 在 Windows 上?可能通过致电WaitForSingleObject。在 Linux 上,可能通过调用 futex
  • @Alasdair 唤醒一个“休眠”线程通常需要一些内核机制,因为它基本上是一个调度程序的问题。例如,这就是您无法在用户空间中实现互斥锁的原因(但您可以实现自旋锁)。
猜你喜欢
  • 2014-07-29
  • 2011-07-29
  • 1970-01-01
  • 2011-06-01
  • 2018-12-04
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多