我有几个工作函数,调用可能有不良事件发生的附件函数。如果附件功能确定发生了不好的事情,我希望能够停止工作功能,而无需在工作功能中进行多次标记检查。例如,
struct Worker {
bool badhappened = false;
Worker() {
std::thread([&]() {
while ( not badhappened );
// kill the work
}).detach();
}
int WorkComponent {
if ( badhappening() )
badhappened = true;
return someint;
}
void DoWork {
// WorkComponents called several times
}
}
但我不知道在kill the work
打电话。 DoWork
在单独的线程中发生并不是问题,但在C ++的线程中似乎没有等效的pthread_kill
。是否有一个解决方案不涉及将多个if(badhappened) return;
调用放入DoWork
?
答案 0 :(得分:6)
长话短说:
没有安全的方法来阻止非合作线程。
是的,有强制关闭线程的工具但是你要求麻烦。唯一安全的方法是就终止政策达成一致。这可以归结为在你写作时经常检查一个标志。
大师的更多信息:
C++ and Beyond 2011: Scott, Andrei and Herb - Ask Us Anything
请参阅30:44有关系统性和原则性线程终止和程序终止的处理是什么?
在POSIX中取消线程也不是一个好主意:
Cancelling a thread using pthread_cancel : good practice or bad