c++ - 如何终止 std::future?

标签 c++ c++11

我对 C++11 std::future 的一些事情感到困惑。我想动态平衡工作负载,所以如果有一些处理器空闲,我创建一个 std::futurestd::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不是我能控制的,return后还运行吗?我怎样才能终止它们以释放它们使用的 CPU 时间?

最佳答案

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

没有办法知道线程是否可以在某个特定时刻安全地停止。线程可能已经获取了应该最终确定的资源。只有运行中的线程自己知道何时可以安全停止。

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

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

关于c++ - 如何终止 std::future?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22653022/

相关文章:

c++ - 在不满足条件的情况下输入 If 语句

c++ - 在 Qt 中运行一个定时器 5 秒

c++ - 无法使用 vector::插入 "no instance of overloaded function..."

c++ - constexpr 和带有重新解释转换的静态 const void 指针的初始化,哪个编译器是正确的?

c++11 - unique_ptr 和 cudaMalloc 的使用

c++ - 我的框架 : Collection of unknown subclasses (hotspot)

c++ - 每次你经过它时循环都会重置吗?

c++ - 如何查找和删除 vector 元素中的某个字符

C++ zip 可变参数模板

c++ - Qt并发: call member function from another class