提问人:whoKnows 提问时间:1/16/2020 更新时间:1/16/2020 访问量:193
在没有轮询的情况下,有没有办法让另一个线程“重置”休眠线程的计时器,使其休眠时间更长?
Without polling, is there a way for another thread to "reset" a sleeping thread's timer, causing it to sleep longer?
问:
假设我们有两个线程,A 和 B.B 会定期执行一些操作,并且 A 被设置为休眠直到某个时间。我希望 B 能够调用一个函数,这将导致 A 的睡眠定时器被延长。如果未被调用,则 A 最终应该会醒来。keepSleeping(A)
keepSleeping(A)
在 Linux 上,有没有办法在不定期唤醒 A 以检查是否调用了 keepSleeping
的情况下实现这一点?
重置线程的睡眠时间会问一个类似的问题,但我想知道是否有更优雅的解决方案,它不需要 A 在不需要时醒来。
答:
不是直接的,不是。如果线程 A 调用了 或类似内容,那么它将在指定的时间唤醒,并且其他线程无法阻止它。当然,如果你愿意,你可以让线程 A 立即再次进入睡眠状态,所以这应该没什么大不了的。sleep()
usleep()
也就是说,如果您根本不希望线程 A 唤醒(除非 B 希望它唤醒),那么获得该行为的一种方法是将线程 A 块放在条件变量上,而不是在调用中。在此设计中,线程 A 将无限期地保持休眠状态,直到线程 B 向条件变量发出信号,此时线程 A 将唤醒,执行其操作,然后再次阻塞条件变量。这将允许线程 B 完全控制线程 A 何时以及是否唤醒。sleep()
在没有轮询的情况下,有没有办法让另一个线程“重置”休眠线程的计时器,使其休眠时间更长?
如果你在谈论,那么就没有办法。如果 A 调用,则在超时到期之前它不会唤醒。您可以通过中断线程来提前唤醒它。但你不能让它直到以后才醒来。Thread.sleep
Thread.sleep(timeout)
通过使用等待/通知并实现单个“睡眠管理器”线程来执行通知,您可以潜在地减少不需要的线程唤醒次数。管理器可以使用定时等待或睡眠来等待它需要做的下一件事。
警告:
在您的方案中,它可能会醒来并发现它不需要执行任何操作。
如果你想让工作线程比原计划更早地唤醒,你可能需要中断睡眠管理器线程。或者直接中断工作线程。
如果您使用这样的中断,您需要确保它不会干扰(潜在的)中断的其他用途。这增加了复杂性。
这种复杂性值得吗?(IMO),仅当您需要频繁更改唤醒时间时。
在您的方案中,简单的方法是让唤醒发生,并让工作线程使用更新的唤醒时间重新进入睡眠状态。
评论