在 parallel_for 中使用函数对象
Posted
技术标签:
【中文标题】在 parallel_for 中使用函数对象【英文标题】:Using function objects in parallel_for 【发布时间】:2010-12-13 17:37:25 【问题描述】:我刚刚学会了如何并行使用函数。以下代码行计算索引的平方值并将其放入该索引处的数组(称为平方)中。 parallel_for 函数在 Visual Studio 2010 中可用,作为标头下的并发命名空间的一部分。
parallel_for(static_cast<size_t>(0), count,
[&squares](size_t n) squares[n] = (n+1)*(n+1); );
您可以看到它使用 lambda 表达式来并行计算平方,并且此代码确实可以正常工作并正确编译。但是,lambda 表达式使 parallel_for 函数与代码杂乱无章。我正在考虑只在函数对象中定义 lambda 表达式,例如:
function<void(size_t)> Squares =
[&squares](size_t n) squares[n] = (n+1)*(n+1); ;
我的问题是如何在 parallel_for 函数中使用这个函数(Squares)?我是否错误地编写了 Squares 函数,或者这只是使用 lambda 表达式的 parallel_for 的范例?您可以继续向我推荐除 Microsoft 之外的其他一些并行库,但我仍然想知道我的问题的答案。
【问题讨论】:
@Steve 我只是简单地将 Squares() 函数放在了 lambda 表达式应该在的位置,VS10 会发现错误并且不会编译。 【参考方案1】:任何 lambda 表达式都可以被认为是相应函数对象的匿名版本。
在您的示例中,您的仿函数工作正常,如下所示:
parallel_for(static_cast<size_t>(0), count, Squares);
来自MSDN docs:
lambda 表达式是一种编程 与匿名相关的技术 职能。匿名函数是 有主体但没有主体的函数 有一个名字。一个 lambda 表达式 隐式定义一个函数对象 类并构造一个函数对象 该类类型。
【讨论】:
【参考方案2】:MSFT 的例子都直接使用了 Lambda。
【讨论】:
以上是关于在 parallel_for 中使用函数对象的主要内容,如果未能解决你的问题,请参考以下文章
填充二维向量的parallel_for lambda函数后出错
tbb::concurrent_hash_map 抛出 SIGSEGV