【发布时间】:2017-03-23 10:33:36
【问题描述】:
我将tbb::parallel_reduce(range,body) 的命令式形式用作documented here。医生说:
parallel_reduce 使用拆分构造函数为每个线程制作一个或多个主体副本。它可以在主体的 operator() 或方法连接同时运行时复制主体。您有责任确保此类并发的安全性。
所以我知道Body::Body( Body&, split ) 可以像Body::operator() 或Body::join( Body& rhs ) 那样运行。
我的问题是:
1) Body::operator() 和 Body::join( Body& rhs ) 可以同时运行吗?
2) Body::join( Body& rhs )可以安全修改rhs吗?
W.r.t. 1),我相信join只能在operator()完成后调用。此外,查看英特尔文档中的示例,很明显他们可以修改相同的数据而不会出现数据竞争问题:
struct Sum {
float value;
...
void operator()( const blocked_range<float*>& r ) {
value = ...;
}
void join( Sum& rhs ) {value += rhs.value;}
};
【问题讨论】:
标签: c++ concurrency tbb