我试图理解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();
}
}
答案 0 :(得分:1)
对我来说还不错。
线程有共享内存,如果对tempData的引用在线程中作为指针出现,那么每个线程都会看到完全相同的指针值和tempData的同一个副本。 [如果你喜欢使用一些全局代码或一些日志记录,你可以检查一下。]
然后,互斥锁确保单线程访问,至少在线程中。
一个问题:某处必须有一个推送到双端队列,也可能需要被互斥锁锁定。 [显然,期货队列的push_back只是本地的。]