作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解 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/
我是一名优秀的程序员,十分优秀!