如何终止std :: future?

Aea*_*ean 8 c++ c++11

我对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标志.