[英]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.