如何终止std :: future?

时间:2014-03-26 06:21:33

标签: c++ c++11

我对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时间?

1 个答案:

答案 0 :(得分:10)

C ++标准没有提供取消未来或停止线程的方法。这是有原因的。

无法知道线程是否可以在某个特定时刻安全停止。线程可能已经获得了应该最终确定的资源。只有正在运行的线程才知道何时可以安全停止。

即使底层的低级API提供了随意终止任何线程的调用,由于上述情况,这绝对不是一个好方法。

此问题的传统解决方案是通过线程发信号并从内部取消它。一个简单的实现可能基于单个原子bool标志。