Boost Thread - 如何确认中断

Posted

技术标签:

【中文标题】Boost Thread - 如何确认中断【英文标题】:Boost Thread - How to acknowledge interrupt 【发布时间】:2011-09-06 07:55:52 【问题描述】:

我有阻塞任务,它将由 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;

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

提前致谢

【问题讨论】:

您正在使用的sleep(14);。这是来自boost::thread 的睡眠还是c 睡眠功能?因为中断只适用于boost::thread:sleep 【参考方案1】:

要使用 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()

【讨论】:

以上是关于Boost Thread - 如何确认中断的主要内容,如果未能解决你的问题,请参考以下文章

中断一个分离的 boost::thread

boost::thread编程-线程中断(转)

boost::thread interrupt() 仅在第一次执行中断点时引发异常?

Boost asio:无法确认文件传输

qt崩溃时boost线程中断

如果未加入则中断线程