Boost线程-如何确认中断



我有阻塞任务,将由find_the_question()函数执行。然而,我不希望线程执行这个函数需要超过10秒。因此,如果它需要超过10秒,我想要关闭该线程并清理所有资源。

我试图为此编写代码,但不知何故,如果线程需要超过10秒,我无法在find_the_question()函数中获得中断。你能告诉我我做错了什么吗?

void find_the_question(std::string value)
{
    //allocate x resources
    try{
        //do some process on resources
            sleep(14);
        //clean resources
    }
    catch(boost::thread_interrupted const& )
    {
        //clean resources
        std::cout << "Worker thread interrupted" << std::endl;
    }
}
int main()
{
        boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(10000);
        std::cout << "In main" << std::endl;
        boost::thread t1(find_the_question, "Can you block me");
        t1.interrupt();
        if (t1.timed_join(timeout))
        {
          //finished
          std::cout << "Worker thread finished" << std::endl;
        }
        else
        {
          //Not finished;
          std::cout << "Worker thread not finished" << std::endl;
        }
        std::cout << "In main end" << std::endl;
}

输出:如果t1需要超过10秒才能完成,我将得到以下控制台输出:

std::cout << "In main" << std::endl;
std::cout << "Worker thread not finished" << std::endl;
std::cout << "In main end" << std::endl;

然而,我期望以下输出

std::cout << "In main" << std::endl;
std::cout << "Worker thread interrupted" << std::endl;
std::cout << "Worker thread not finished" << std::endl;
std::cout << "In main end" << std::endl;

你能告诉我我做错了什么吗?

Thanks in advance

要使用boost::thread::interrupt(),您必须使用boost::thread::sleep()才能使其工作。

一个正在运行的线程可以通过调用interrupt()成员来中断对应boost::thread对象的函数。当被中断的线程接下来执行指定的中断之一点(或者如果当前在执行一个时被阻塞)中断被启用,那么boost::thread_interrupted异常将在被中断的线程中抛出。如果没有抓住,这将导致被中断线程的执行要终止。和任何否则,堆栈将被展开,析构函数为自动存储时间的对象将被执行

预定义中断点:

以下函数是中断点,它们将抛出Boost::thread_interrupted如果当前线程被启用中断线程,当前线程请求中断:

boost::thread::join()
boost::thread::timed_join()
boost::condition_variable::wait()
boost::condition_variable::timed_wait()
boost::condition_variable_any::wait()
boost::condition_variable_any::timed_wait()
boost::thread::sleep()
boost::this_thread::sleep()
boost::this_thread::interruption_point()

最新更新