parallel_do_feeder线程安全吗?

时间:2012-03-27 02:45:06

标签: c++ tbb

以下代码存在并发问题。此处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线程安全的讨论。

1 个答案:

答案 0 :(得分:1)

是的,parallel_do_feeder是线程安全的。

GNode线程的复制构造函数是否安全?传递给GNode的{​​{1}}实例被复制到将要处理它的任务中(可能在另一个线程中)。