删除已完成的期货以保持其数量不变

时间:2015-02-05 21:55:00

标签: c++11 asynchronous containers bigdata future

我有一个需要推出大量期货的计划;特别是,超过size_t。拥有许多未来的正常方法是将它们保存在容器中,但由于它们太多,我必须删除已完成的容器。该程序需要并行计算新行的数量。

这就是我想要为n>size_t工作的内容:

vector<future<int>> vf;
for(size_t i=0; i<n;++i){
  vf.emplace_back(async([&](){ return count_lines(part_of_an_array);});
}
double cnt=0;
for(auto i:vf) cnt+=i;

我想到的一种方法是保持vector<char> busy_fvector<bool>可能不是线程安全的)。当count_lines开始时 - &gt; busy_f[i_future]=0,以及何时完成 - &gt; busy_f[i_future]=1

有更快的方法吗?

1 个答案:

答案 0 :(得分:1)

在这种情况下“手动”创建线程甚至期货通常不是一个好主意,因为很难创建它们的“正确数量”:记住你只有相对较少的实际内核/线程执行,并创建所有额外的未来,不立即映射到一个线程,只是阻止,等待和占用内存空间是浪费。

我使用某种更高级别的并行化原语,比如'parallel for'或并行map-reduce实现。

我不知道你正在使用什么操作系统/编译器,所以我建议将TBB用作跨平台解决方案。如果您使用的是Microsoft堆栈,则它们拥有自己的并行库,这在某些方面优于TBB。

在TBB中,他们有parallel_reduce模板功能,看起来与您的需求完全相同,并注明他们的承诺:

  

如果范围和正文占用O(1)空格,则范围分成   几乎相等的部分,那么空间复杂度是O(P log(N)),其中N   是范围的大小,P是线程数。

但是,TBB中的所有范围都限制为size_t ...也许你可以编写一个外部循环,它从较大的问题中“生成”size_t元素的“块”,然后对于每个块,你可以调用parallel_reduce和总结他们的结果。

double result = 0;
for(BingNumber offset = 0; offset < n; offset += BigNumber(size_t_size))
{
   result += parallel_reduce( ... )
}