我有一个创建线程并存储它的类。在做一些事情时,这个线程会注意到一些错误,通知类并自行中断。
class foo {
public:
enum mode {
run=0,
booboo,
stop
};
foo() {
th_ = boost::thread(boost::bind(&foo::bar, this));
mode_ = run;
}
~foo() {
stop();
}
void stop() {
mode_ = stop;
th_.join();
}
void bar {
for(;;) {
if(mode_ == stop)
return;
if(error) {
mode_ = booboo;
th_.interrupt();
// the sleep is the interruption point
boost::this_thread::sleep_for(boost::chrono::nanoseconds(0));
}
// do some stuff
}
}
private:
boost::thread th_;
mode mode_;
};
根据boost::thread.interrupt,没有迹象表明这不起作用。如果我理解正确,interrupt
将标记线程在下一个interruption_point中断它,在我的情况下是sleep_for的调用。
在我的机器和操作系统上,它正在运行,所以我的问题是,这样做是否安全?