我正在编写具有单个作者和多个读者的并行代码。作者将从头到尾填充一个数组,而读者将按顺序访问该数组的元素。伪代码如下所示:
std::vector<Stuff> vec(knownSize);
int producerIndex = 0;
std::atomic<int> consumerIndex = 0;
生产者线程:
for(a while){
vec[producerIndex] = someStuff();
++producerIndex;
}
使用者线程:
while(!finished){
int myIndex = consumerIndex++;
while(myIndex >= producerIndex){ spin(); }
use(vec[myIndex]);
}
我是否需要围绕producerIndex进行任何形式的同步?似乎可能发生的最糟糕的事情是,我会在更新旧值时读取旧值,因此我可能要多花一点时间。我有什么想念的吗?我可以确定对myIndex的每次分配都是唯一的吗?
最佳答案
正如评论所指出的那样,此代码具有数据竞争。无需猜测代码是否有可能做您想要的事情,只需对其进行修复:将producerIndex
和consumerIndex
的类型从int
更改为std::atomic<int>
,并让编译器实现者和标准库实现者担心如何在您的应用程序上正确地工作目标平台。