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