在特定时间后唤醒线程
Wake up a thread after a specific time
我有两个线程,比如1和2,并且已经让2进入睡眠状态。1执行某些任务,并将计时器设置为在任务完成后2"t"秒唤醒。
所以,我需要编程在2秒后发送信号。我怎样才能做到这一点?
您可以对条件变量使用定时等待,该变量将在达到/超过该时间时唤醒。你也可以让线程睡眠一段时间。
pthreads(您指定的)只有一个等待,直到一个绝对时间。
新的标准C++库和boost为您提供了wait_for(time_period)
或wait_until(absolute_time)
的选项。
在你的情况下,我认为你不需要做任何这些,但你可能会使用第三个线程。
-
线程1执行任务,线程2等待一个条件变量,当线程1完成任务时,它会创建第三个线程,该线程休眠并唤醒线程2。
-
线程1执行该任务并立即向线程2保存的条件变量发出信号,但线程2在继续之前会休眠。(所以实际上它醒得更早,但它模拟了延迟)。不需要第三个线程,但是线程2可能是一个"客户端"线程,并且您希望强制执行延迟,所以如果是这样的话,请使用方法1。
在C++11之前,标准库不提供计时器。即使使用C++11,您也有标准的计时设施(例如,睡眠、条件变量等),但您必须将它们组合起来才能获得所需的行为。
因此,您大致有以下提示:
- 依赖某些特定的(跨平台)库(例如,Qt、Boost等)
- 依赖操作系统级别的设施(例如,Linux上的Posix)
- 创建充当计时器的第三个线程:一旦激活,它将休眠2秒,然后通过条件变量向第二个线程发出信号
- 让第一个线程计算工作完成后等待的时间,使其休眠,然后通过条件变量向另一个线程发出信号
我建议最后一种选择。
相关文章:
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 如果我们使用 notify_one() 来唤醒线程,我们还需要 yield() - C++?
- 唤醒多个线程以在每个条件下工作一次
- 视频在唤醒其他线程时输入设备断开连接
- 线程启动延迟 - 通知所有未唤醒所有线程
- 使用 Poco:Condition 唤醒两个线程
- std::condition_variable::notify_one() 不会唤醒等待线程
- 唤醒线程很耗时
- 如何定期唤醒 C++ 11 线程
- 我可以"force"线程唤醒吗?
- pthread_cond_wait唤醒多线程示例
- 如何唤醒从另一个线程选择没有超时时间的呼叫
- Boost::线程 / C++11 std::thread,想要唤醒工作线程的条件
- 固定到内核的 FIFO 线程上的 std::p romise::set_value 不会唤醒 std::future
- 在特定时间后唤醒线程
- c++信号处理程序可以唤醒线程
- c++ Windows在等待中强制唤醒线程
- 正在从信号处理程序唤醒线程
- 在不使用条件变量的情况下唤醒线程的最快方法