如何在c++中中断boost::this_thread

How to interrupt boost::this_thread in c++

本文关键字:this thread boost 中断 c++      更新时间:2023-10-16

在我的应用程序中,我已经给了10秒的睡眠。我已经使用boost::this_thread::sleep函数给了睡眠。是否有任何可能的方法来中断boost::this_thread::sleep函数?

来自sleep()参考:

抛出:

如果当前执行线程被中断,则返回boost::thread_interrupted

指出:sleep()是预定义的中断点之一

所以你需要在线程中做的是把sleep()调用放在try-catch中,并捕获boost::thread_interrupted。然后调用线程对象上的interrupt()来中断睡眠。


顺便说一下,也是来自sleep参考:

3.0.0后已弃用。

使用sleep_for()sleep_until()代替。

可以使用interrupt()中断sleep功能。

你必须为你的线程启用中断,当它处于睡眠状态时,你可以使用中断函数。

Boost在网上有一个很好的关于这个的简短教程,看看这里:http://www.boost.org/doc/libs/1_54_0/doc/html/thread/thread_management.html#thread.thread_management.tutorial.interruption

我已经给睡眠使用boost::this_thread::sleep函数。是否有任何可能的方法来中断boost::this_thread::sleep函数?

不是这样的,但实现它并不困难,就boost::this_thread::sleep而言:

void sleep_for(boost::posix_time::milliseconds interval, std::atomic<bool>& interrupted)
{
    static const auto resolution = boost::posix_time::milliseconds(10));
    ptime end_time(microsec_clock::local_time()) + interval;
    while( !interrupted.load() )
    {
        boost::this_thread::sleep(resolution);
        if(microsec_clock::local_time() > end_time)
            break;
    }
}
客户端代码线程1:
std::atomic<bool>& interrupt = false;
void f() {
    sleep_for(boost::posix_time::milliseconds(200), interrupt);
}

客户端代码线程2:

interrupt.store(true); /// will cause thread 1 to be interrupted, if called
                       /// during execution of sleep_for.