【发布时间】:2014-05-04 09:13:40
【问题描述】:
我对 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 时间?
【问题讨论】:
-
这很简单:你不能。事实上,在标准中没有办法取消futures 或线程。
-
我的目标是Windows平台,不需要移植。像
TerminateThread( thread->nativeHandle(), 0 )这样的平台相关方法也是可以接受的。但我也不知道如何获取原生句柄。 -
虽然您可以从
std::thread获取本机句柄,但它不适用于std::future。可能是因为期货不必在线程中运行。 -
async 在 MSVC 实现中使用了一个线程池,因此终止其中一个线程池不是一个好主意。
-
两个字:合作取消。检查您的工作任务中的标志,如果已设置,则从内部优雅地终止它们(即停止工作)。