在使用C ++ 11线程模型或TBB线程类时,如何取消其他线程(如果使用pthread lib,可以使用pthread_cancel取消其他线程)? Ps:在C ++ 11线程模型或tbb线程类中是否有线程取消点的概念为pthread?
答案 0 :(得分:2)
TBB提供线程类作为C ++ 03的兼容层,尽可能接近C ++ 11。其他库(例如boost)也提供了一个没有cancel()
方法的线程类。
因此问题是“如何在C ++中取消线程”。答案是:没有内置取消,只有interrupt politely。
pthread_cancel
对于通用C ++程序来说是一个坏主意,因为它不尊重对象的生命周期。
编写自己的取消点,读取取消标记,如果已设置,则抛出异常以正确展开堆栈。
std::atomic<bool> is_cancelled;
void check_cancel() {
if(is_cancelled)
throw std::runtime_error("cancelled");
}