平行送丝器螺纹是否安全

Is parallel_do_feeder thread safe?

本文关键字:是否 安全      更新时间:2023-10-16

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

是的,parallel_do_feeder是线程安全的。

GNode线程的复制构造函数安全吗?传递给parallel_do_feeder::add()GNode的实例被复制到将处理它的任务中(可能在另一个线程中)。