我是否以线程安全的方式使用此双端队列?

时间:2014-05-07 02:58:09

标签: c++ multithreading thread-safety

我试图理解C ++中的多线程。在下面的代码中,deque" tempData'在retrieve()中声明的每个元素总是只处理一次,或者可能在多个线程中有多个tempData副本和过时数据,导致一些元素被多次处理?我不确定通过引用传递实际上是否导致在这种情况下只有一个副本?

static mutex m;

void AudioAnalyzer::analysisThread(deque<shared_ptr<AudioAnalysis>>& aq)
{

    while (true)
    {
        m.lock();
        if (aq.empty())
        {
            m.unlock();
            break;
        }
        auto aa = aq.front();
        aq.pop_front();
        m.unlock();

        if (false) //testing
        {
            retrieveFromDb(aa);
        }
        else
        {
            analyzeAudio(aa);
        }
    }
}

void AudioAnalyzer::retrieve()
{
    deque<shared_ptr<AudioAnalysis>>tempData(data);
    vector<future<void>> futures;
        for (int i = 0; i < NUM_THREADS; ++i)
    {
        futures.push_back(async(bind(&AudioAnalyzer::analysisThread, this, _1), ref(tempData)));
    }

    for (auto& f : futures)
    {
        f.get();
    }
}

1 个答案:

答案 0 :(得分:1)

对我来说还不错。

线程有共享内存,如果对tempData的引用在线程中作为指针出现,那么每个线程都会看到完全相同的指针值和tempData的同一个副本。 [如果你喜欢使用一些全局代码或一些日志记录,你可以检查一下。]

然后,互斥锁确保单线程访问,至少在线程中。


一个问题:某处必须有一个推送到双端队列,也可能需要被互斥锁锁定。 [显然,期货队列的push_back只是本地的。]