繁体   English   中英

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

[英]Am I using this deque in a thread safe manner?

我试图了解C ++中的多线程。 在下面的代码中,retrieve()中声明的双端队列'tempData'将始终使每个元素处理一次且仅处理一次,还是在多个带有过时数据的线程中存在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();
    }
}

在我看来还可以。

线程具有共享内存,并且如果对tempData的引用作为线程中的指针出现,则每个线程将看到完全相同的指针值和相同的tempData单个副本。 [您可以检查一下是否需要一些全局代码或一些日志记录。]

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


一个问题:在某处一定要推动双端队列,而这可能也需要由互斥锁锁定。 [显然,将push_back推送到期货队列只是本地的。]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM