gpt4 book ai didi

c++ - 我是否以线程安全的方式使用这个双端队列?

转载 作者:行者123 更新时间:2023-11-28 06:53:10 25 4
gpt4 key购买 nike

我正在尝试了解 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 到 futures 队列只是本地的。]

关于c++ - 我是否以线程安全的方式使用这个双端队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23507955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com