2014-09-30 90 views
0

我有两个线程,比如说1和2,并且已经把2放到了睡眠状态。 1执行一些任务,并设置一个计时器在任务完成后2秒钟醒来。在特定时间后唤醒线程

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

+1

使用条件变量。你在用什么框架? – nikitoz 2014-09-30 11:22:02

+0

@nikitoz'pthreads' – harper 2014-09-30 11:22:31

+0

为什么在任务完成后立即将信号发送到线程2,并让该线程等待't'秒后再响应信号? – user2079303 2014-09-30 11:24:04

回答

0

在比C++ 11之前,标准库没有提供定时器。即使使用C++ 11,您也可以使用standrd时序工具(例如睡眠,条件变量等),但您必须将它们组合起来以获得所需的行为。

所以,你大致有以下otions:

  • 依靠一些特定的(跨平台)库(例如,QT,升压等)
  • 依赖于操作系统级别的设施(如,Linux上的Posix)
  • 创建第三个作为定时器的线程:一旦激活,它将休眠2秒,然后通过条件变量发信号通知第二个线程
  • 让第一个线程计算等待完成工作,让它睡觉,然后通过另一个线程发出信号条件变量

我建议最后一个选项。

+0

标准库有定时器让线程休眠,等待互斥量,等待条件变量和等待期货。 – 2014-09-30 11:32:28

+0

我不明白最后的选择,你能否详细说明一下? - 就像第一次睡觉之后你怎么能发出第二条线?我想设置一个定时器来发送来自第一个线程的信号 – glugglug 2014-09-30 11:36:01

1

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

pthreads(您指定的)只有等到绝对时间。

新的标准C++库和增强版提供了wait_for(time_period)wait_until(absolute_time)的选项。

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

  1. 线程1执行任务,线程2个等待条件变量,当线程1完成它创建,睡和醒螺纹的第三线程中的任务2.

  2. 线程1执行任务和立即发出线程2所持有的条件变量的信号,但线程2在它继续之前休眠。 (所以它真的早早醒来,但它模拟了延迟)。不需要第三个线程,但是线程2可能是一个“客户端”线程,并且您想强制执行延迟,因此如果是这种情况,请使用方法1。

+0

如果线程2在任务完成时立即被唤醒,然后使自己重新进入睡眠状态,并且超时,您可以取消第三个线程。 – 2014-09-30 11:36:19

+0

是的,这是方法2,但如果线程2由客户端,你想强迫他们得到延迟,你会使用方法1. – CashCow 2014-09-30 11:59:39

+0

哦,是的,所以这是...是编辑的答案或我只是没有读到最后?! :-) – 2014-09-30 12:09:14