0
以下代码有并发问题。这里的inDegVec
是全球的int *
,而getGUID()
和getTime()
是POD变量的无害访问器。parallel_do_feeder线程安全吗?
void operator() (GNode& src,
tbb::parallel_do_feeder<GNode>& feed_it)
const
{
std::list<GNode> addNodes;
// some thread-safe code that populates addNodes
while (!addNodes.empty()) {
feed_it.add(addNodes.front());
addNodes.pop_front();
}
if (inDegVec[srcAVI->getUID()] == 0) {
// srcAVI is still the minimum among its neighbors
if (srcAVI->getTime() < colTime) {
//lwl.push (src);
//tbb::mutex::scoped_lock lock(histMutex);
assert(addNodes.empty());
feed_it.add(src);
}
}
};
如果我换一个互斥体的while
/if
块,代码工作。但为什么这是必要的? parallel_do_feeder::add()
不是线程安全的吗?我见过的示例代码(例如http://llpanorama.wordpress.com/2008/03/09/parallel_do-parallel-done/)不使用同步,表明它是...并且我在TBB手册中没有看到parallel_do_feeder线程安全的讨论。
代码如何失败? – 2012-03-27 16:53:57