回答
在比C++ 11之前,标准库没有提供定时器。即使使用C++ 11,您也可以使用standrd时序工具(例如睡眠,条件变量等),但您必须将它们组合起来以获得所需的行为。
所以,你大致有以下otions:
- 依靠一些特定的(跨平台)库(例如,QT,升压等)
- 依赖于操作系统级别的设施(如,Linux上的Posix)
- 创建第三个作为定时器的线程:一旦激活,它将休眠2秒,然后通过条件变量发信号通知第二个线程
- 让第一个线程计算等待完成工作,让它睡觉,然后通过另一个线程发出信号条件变量
我建议最后一个选项。
标准库有定时器让线程休眠,等待互斥量,等待条件变量和等待期货。 – 2014-09-30 11:32:28
我不明白最后的选择,你能否详细说明一下? - 就像第一次睡觉之后你怎么能发出第二条线?我想设置一个定时器来发送来自第一个线程的信号 – glugglug 2014-09-30 11:36:01
您可以对条件变量使用定时等待,该条件变量在达到/过去时会唤醒。你也可以让线程睡一段时间。
pthreads(您指定的)只有等到绝对时间。
新的标准C++库和增强版提供了wait_for(time_period)
或wait_until(absolute_time)
的选项。
在你的情况下,我不认为你需要做任何这一点,但你可能会使用第三线程。
线程1执行任务,线程2个等待条件变量,当线程1完成它创建,睡和醒螺纹的第三线程中的任务2.
线程1执行任务和立即发出线程2所持有的条件变量的信号,但线程2在它继续之前休眠。 (所以它真的早早醒来,但它模拟了延迟)。不需要第三个线程,但是线程2可能是一个“客户端”线程,并且您想强制执行延迟,因此如果是这种情况,请使用方法1。
如果线程2在任务完成时立即被唤醒,然后使自己重新进入睡眠状态,并且超时,您可以取消第三个线程。 – 2014-09-30 11:36:19
是的,这是方法2,但如果线程2由客户端,你想强迫他们得到延迟,你会使用方法1. – CashCow 2014-09-30 11:59:39
哦,是的,所以这是...是编辑的答案或我只是没有读到最后?! :-) – 2014-09-30 12:09:14
- 1. 在指定时间唤醒线程
- 2. 如何使随机线程等待,然后在恒定时间后唤醒
- 3. 我如何在指定的时间唤醒线程objective-c
- 4. 在iOS中的特定时间唤醒应用程序
- 5. 如何在特定时间唤醒android应用程序?
- 6. 特定时间后从睡眠中唤醒c#
- 7. 唤醒睡眠线程
- 8. 信号唤醒线程
- 9. Java并发唤醒线程
- 10. Scala:唤醒睡眠线程
- 11. Java唤醒阻塞线程定期
- 12. 当事件发生时唤醒线程
- 13. 守护线程以不同的时间间隔唤醒
- 14. 在C中唤醒休眠线程的剩余时间#
- 15. 如何在时间到来之前唤醒线程
- 16. 我可以唤醒特定的Haskell线程吗?
- 17. 如何通过notify/wait()唤醒/暂停特定(一组)线程?
- 18. 线程#运行和线程#唤醒之间的区别?
- 19. 在java中唤醒等待线程
- 20. 如何在Perl中唤醒线程
- 21. Swift - 有没有办法在特定时间唤醒我的应用程序?
- 22. 为什么我的线程不会在notifyAll()后唤醒;
- 23. 如何在收到2个数据包后唤醒线程
- 24. 从另一个线程唤醒
- 25. 如何唤醒“等待”线程?
- 26. java线程等待并自动唤醒
- 27. notify_all没有唤醒等待线程
- 28. 每n秒唤醒一次线程
- 29. 如何唤醒睡眠(3)ing线程
- 30. 块和唤醒消费者线程/
使用条件变量。你在用什么框架? – nikitoz 2014-09-30 11:22:02
@nikitoz'pthreads' – harper 2014-09-30 11:22:31
为什么在任务完成后立即将信号发送到线程2,并让该线程等待't'秒后再响应信号? – user2079303 2014-09-30 11:24:04