【问题标题】:Without polling, is there a way for another thread to "reset" a sleeping thread's timer, causing it to sleep longer?没有轮询,有没有办法让另一个线程“重置”睡眠线程的计时器,使其睡眠时间更长?
【发布时间】:2020-05-02 20:04:33
【问题描述】:

假设我们有两个线程,A 和 B。B 周期性地做一些动作,而 A 被设置为休眠直到某个时间。我希望 B 能够调用函数keepSleeping(A),这将导致 A 的睡眠定时器被延长。如果keepSleeping(A) 没有被调用,A 最终应该会被唤醒。

在 Linux 上,有没有办法实现这一点不定期唤醒 A 以检查是否已调用 keepSleeping

Resetting sleeping time of a thread 提出了类似的问题,但我想知道是否有更优雅的解决方案,不涉及 A 在不需要时醒来。

【问题讨论】:

  • 如果你在谈论 Thread::sleep,那么答案是否定的。

标签: linux multithreading language-agnostic


【解决方案1】:

不直接,不。如果线程 A 调用了sleep()usleep() 或类似的,那么它将在指定的时间唤醒,并且没有其他线程可以阻止它。当然,如果你愿意,你可以让线程 A 立即再次进入睡眠状态,所以这应该没什么大不了的。

也就是说,如果您根本不希望线程 A 唤醒(除非 B 想要唤醒),那么获得该行为的一种方法是将线程 A 块放在 condition-variable 上而不是内部一个sleep() 电话。在这种设计中,线程 A 将无限期地保持休眠状态,直到线程 B 向条件变量发出信号,此时线程 A 将醒来,做它的事情,然后再次阻塞条件变量。这将允许线程 B 完全控制线程 A 何时唤醒。

【讨论】:

    【解决方案2】:

    如果不进行轮询,有没有办法让另一个线程“重置”休眠线程的计时器,从而使其休眠更长时间?

    如果你说的是Thread.sleep,那就没办法了。如果 A 调用Thread.sleep(timeout),那么它直到超时后才会唤醒。您可以通过中断线程提前唤醒它。但是你不能让它不醒来直到以后。

    通过使用等待/通知并实现单个“睡眠管理器”线程来执行通知,您可以潜在地减少不需要的线程唤醒次数。经理可以使用定时等待或睡眠来等待它需要做的下一件事情。

    注意事项:

    • 在您的场景中,它可能会醒来并发现它不需要做任何事情。

    • 如果您想让工作线程早于唤醒,您可能需要中断睡眠管理器线程。或者直接中断工作线程。

    如果您使用这样的中断,您需要确保它不会干扰(潜在的)中断的其他用途。这增加了复杂性。

    复杂性值得吗? (IMO),仅当您需要频繁更改唤醒时间时。

    在您的场景中,简单的方法是让唤醒发生,并让工作线程使用更新的唤醒时间重新进入睡眠状态。

    【讨论】:

      猜你喜欢
      • 2011-03-28
      • 1970-01-01
      • 2012-08-08
      • 2019-11-29
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      相关资源
      最近更新 更多