Linux 在没有轮询的情况下,是否有其他线程可以;重置";睡线';s定时器,使其睡眠时间更长?

Linux 在没有轮询的情况下,是否有其他线程可以;重置";睡线';s定时器,使其睡眠时间更长?,linux,multithreading,language-agnostic,Linux,Multithreading,Language Agnostic,假设我们有两个线程,A和B。B定期执行一些操作,A被设置为睡眠,直到某个时间。我希望B能够调用函数keepSleeping(a),这将导致a的睡眠计时器延长。如果没有调用保持睡眠(A),A最终应该会醒来 在Linux上,有没有一种方法可以实现这一点,而不必定期唤醒服务器来检查是否调用了keepSleeping 问了一个类似的问题,但我想知道是否有一个更优雅的解决方案,它不需要在不需要的时候醒来。不是直接的,不是。如果线程a调用了sleep()或usleep()或类似的方法,那么它将在指定的时间醒

假设我们有两个线程,A和B。B定期执行一些操作,A被设置为睡眠,直到某个时间。我希望B能够调用函数
keepSleeping(a)
,这将导致a的睡眠计时器延长。如果没有调用保持睡眠(A),A最终应该会醒来

在Linux上,有没有一种方法可以实现这一点,而不必定期唤醒服务器来检查是否调用了
keepSleeping


问了一个类似的问题,但我想知道是否有一个更优雅的解决方案,它不需要在不需要的时候醒来。

不是直接的,不是。如果线程a调用了
sleep()
usleep()
或类似的方法,那么它将在指定的时间醒来,其他线程无法阻止它。当然,如果你愿意的话,你可以让一条线立即回到睡眠状态,所以这应该不是什么大问题

这就是说,如果您根本不想让线程A醒来(B希望它醒来时除外),那么获得该行为的一种方法是将线程A块放在A上,而不是在
sleep()
调用中。在这种设计中,线程A将无限期地保持休眠状态,直到线程B向条件变量发出信号,此时线程A将唤醒,执行其操作,然后再次阻塞条件变量。这将允许线程B完全控制线程A何时以及是否唤醒

在没有轮询的情况下,是否有其他线程可以“重置”睡眠线程的计时器,从而延长睡眠时间

如果你说的是
Thread.sleep
,那就没有办法了。如果调用了
Thread.sleep(timeout)
,则在超时过期之前它不会醒来。您可以通过中断线程更早地唤醒它。但你不能让它在晚些时候醒来

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

注意事项:

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

  • 如果您想让工作线程比原来计划的更早唤醒,您可能需要中断睡眠管理器线程。或者直接中断工作线程

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

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


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

如果您谈论的是thread::sleep,那么答案是否定的。