我对C++ 11的一些事情感到困惑std::future.我想动态平衡工作负载,所以如果有一些处理器空闲,我创建一个std::futurewith 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();
Run Code Online (Sandbox Code Playgroud)
但有时,一旦找到一些特殊数据项,所有其他数据将被丢弃,程序应立即给出最终结果,然后将启动另一个任务.
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();
Run Code Online (Sandbox Code Playgroud)
但创建的f是我无法控制的,它们在返回后仍在运行吗?如何终止它们以释放它们使用的CPU时间?
Ser*_* K. 11
C++标准没有提供取消未来或停止线程的方法.这是有原因的.
无法知道线程是否可以在某个特定时刻安全停止.线程可能已经获得了应该最终确定的资源.只有正在运行的线程才知道何时可以安全停止.
即使底层的低级API提供了随意杀死任何线程的调用,由于上述情况,这绝对不是一个好的方法.
这个问题的传统解决方案是发出信号并从内部取消它.一个简单的实现可以基于单个原子bool标志.