2012-03-27 55 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的实例是复制到将处理它的任务(可能在另一个线程中)。