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

时间:2015-05-29 11:43:38

标签: c++ boost-thread

在我的申请中,我已经睡了10秒。我使用boost :: this_thread :: sleep函数给出了睡眠。 有没有办法中断boost :: this_thread :: sleep函数。?

3 个答案:

答案 0 :(得分:1)

来自make sure each controller method has a ValidateAntiForgeryToken attribute?

  

<强>抛出:      boost::thread_interrupted如果当前执行线程被中断。

     

备注:      sleep()是预定义的sleep() reference之一。

因此,您需要在线程中执行的操作是将sleep()调用放入try-catch,然后捕获boost::thread_interrupted。然后在线程对象上调用interruption points来中断睡眠。

顺便说一句,也来自interrupt()

  

警告

     

自3.0.0以来已弃用。

     

改为使用sleep referencesleep_for()

答案 1 :(得分:0)

您可以使用sleep暂停interrupt()功能。

你必须为你的线程启用中断,当它休眠时,你可以使用中断函数。

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

答案 2 :(得分:0)

  

我使用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.