我对C ++ 11 std::future
的某些事情感到困惑。我想动态平衡工作负载,因此如果某些处理器处于空闲状态,我会创建std::future
std::async
来划分剩余数据。它工作正常。
std::future<int> f[MAX_CHILD];
for ( each data item ){
if ( found_idle_processor )
f[i] = std::async( ... );
process();
}
// At last, query the result of f.
for ( each future )
hold = f[i].get();
但有时,一旦发现某些特殊数据项,所有其他数据都将被丢弃,程序应立即给出最终结果,然后启动另一项任务。
std::future<int> f[MAX_CHILD];
for ( each data item ){
if ( found_idle_processor )
f[i] = std::async( ... );
process();
if ( found_special_item )
return final_result;
}
// At last, query the result of each f.
for ( each future )
hold = f[i].get();
但是创建的f
不受我的控制,它们在返回后仍在运行吗?如何终止它们以释放它们使用的CPU时间?
答案 0 :(得分:10)
C ++标准没有提供取消未来或停止线程的方法。这是有原因的。
无法知道线程是否可以在某个特定时刻安全停止。线程可能已经获得了应该最终确定的资源。只有正在运行的线程才知道何时可以安全停止。
即使底层的低级API提供了随意终止任何线程的调用,由于上述情况,这绝对不是一个好方法。
此问题的传统解决方案是通过线程发信号并从内部取消它。一个简单的实现可能基于单个原子bool
标志。