在特定时间后唤醒线程



我有两个线程,比如1和2,并且已经让2进入睡眠状态。1执行某些任务,并将计时器设置为在任务完成后2"t"秒唤醒。

所以,我需要编程在2秒后发送信号。我怎样才能做到这一点?

您可以对条件变量使用定时等待,该变量将在达到/超过该时间时唤醒。你也可以让线程睡眠一段时间。

pthreads(您指定的)只有一个等待,直到一个绝对时间。

新的标准C++库和boost为您提供了wait_for(time_period)wait_until(absolute_time)的选项。

在你的情况下,我认为你不需要做任何这些,但你可能会使用第三个线程。

  1. 线程1执行任务,线程2等待一个条件变量,当线程1完成任务时,它会创建第三个线程,该线程休眠并唤醒线程2。

  2. 线程1执行该任务并立即向线程2保存的条件变量发出信号,但线程2在继续之前会休眠。(所以实际上它醒得更早,但它模拟了延迟)。不需要第三个线程,但是线程2可能是一个"客户端"线程,并且您希望强制执行延迟,所以如果是这样的话,请使用方法1。

在C++11之前,标准库不提供计时器。即使使用C++11,您也有标准的计时设施(例如,睡眠、条件变量等),但您必须将它们组合起来才能获得所需的行为。

因此,您大致有以下提示:

  • 依赖某些特定的(跨平台)库(例如,Qt、Boost等)
  • 依赖操作系统级别的设施(例如,Linux上的Posix)
  • 创建充当计时器的第三个线程:一旦激活,它将休眠2秒,然后通过条件变量向第二个线程发出信号
  • 让第一个线程计算工作完成后等待的时间,使其休眠,然后通过条件变量向另一个线程发出信号

我建议最后一种选择。

最新更新