【发布时间】:2015-05-29 11:43:37
【问题描述】:
在我的应用程序中,我设置了 10 秒的睡眠时间。我使用 boost::this_thread::sleep 函数给了睡眠。 有没有办法中断 boost::this_thread::sleep 函数?
【问题讨论】:
-
@WouterHuysentruit,你应该回答有趣吗?
标签: c++ boost-thread
在我的应用程序中,我设置了 10 秒的睡眠时间。我使用 boost::this_thread::sleep 函数给了睡眠。 有没有办法中断 boost::this_thread::sleep 函数?
【问题讨论】:
标签: c++ boost-thread
投掷:
boost::thread_interrupted如果当前执行线程被中断。注意事项:
sleep()是预定义的interruption points 之一。
所以你需要在你的线程中做的是把sleep() 调用放在try-catch 中,然后捕获boost::thread_interrupted。然后在线程对象上调用interrupt()来中断睡眠。
顺便说一句,同样来自sleep reference:
警告
自 3.0.0 起已弃用。
请改用
sleep_for()和sleep_until()。
【讨论】:
boost::this_thread::sleep 正如我在回答中的链接中引用的那样,是一个中断点。请阅读我的回答中提供的链接。
您可以使用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.
【讨论】: