【问题标题】:How to terminate a std::future?如何终止 std::future?
【发布时间】:2014-05-04 09:13:40
【问题描述】:

我对 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 不在我的控制范围内,返回后它们还在运行吗?如何终止它们以释放它们使用的 CPU 时间?

【问题讨论】:

  • 这很简单:你不能。事实上,在标准中没有办法取消futures 线程。
  • 我的目标是Windows平台,不需要移植。像TerminateThread( thread-&gt;nativeHandle(), 0 ) 这样的平台相关方法也是可以接受的。但我也不知道如何获取原生句柄。
  • 虽然您可以从 std::thread 获取本机句柄,但它不适用于 std::future。可能是因为期货不必在线程中运行。
  • async 在 MSVC 实现中使用了一个线程池,因此终止其中一个线程池不是一个好主意。
  • 两个字:合作取消。检查您的工作任务中的标志,如果已设置,则从内部优雅地终止它们(即停止工作)。

标签: c++ c++11


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回答。 AFAIK pthread 提供了一组方法 pthread_setcanceltype pthread_testcancelpthread_cancel 可以安全轻松地终止线程。很遗憾知道 C++ 没有这样的等价物。
  • @Aean:是的,他们可以终止线程。但一般来说,没有办法从外部安全地执行此操作而不会产生副作用(网络服务器线程的图像终止)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多