以下代码存在并发问题。此处inDegVec
是全局int *
,getGUID()
和getTime()
是POD变量的无害访问者。
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线程安全的讨论。
答案 0 :(得分:1)
是的,parallel_do_feeder
是线程安全的。
GNode
线程的复制构造函数是否安全?传递给GNode
的{{1}}实例被复制到将要处理它的任务中(可能在另一个线程中)。