2012-03-27 14 views
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線程安全的討論。

+0

代碼如何失敗? – 2012-03-27 16:53:57

回答

1

是的,parallel_do_feeder是線程安全的。

線程安全嗎GNode的拷貝構造函數是否安全?傳遞給parallel_do_feeder::add()GNode的實例是複製到將處理它的任務(可能在另一個線程中)。