簡體   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