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 - 如何确认中断的主要内容,如果未能解决你的问题,请参考以下文章