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



我有一个程序需要启动大量期货;特别是比CCD_。有很多期货的一个正常方法是把它们放在一个容器里,但由于它们太多了,我不得不把成品去掉。程序需要计算并行的新行数。

这就是我想为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开始-->busy_f[i_future]=0时,以及何时结束-->busy_f[i_future]=1时。

有没有更快的方法?

在这种情况下"手动"创建线程甚至期货通常不是一个好主意,因为很难创建"适当数量"的线程:记住,你只有相对少量的实际核心/线程要执行,并创建所有额外的期货,不立即映射到线程并且只是阻塞和等待并且占用存储器中的空间是浪费的。

我会使用某种更高级的并行化原语,比如"parallel for"或并行映射减少实现。

我不知道您使用的是什么操作系统/编译器,所以我建议使用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( ... )
}

最新更新