我正在尝试开发以下无锁代码(c ++ 11):
int val_max;
std::array<std::atomic<int>, 255> vector;
if (vector[i] > val_max) {
val_max =vector[i];
}
问题是当有许多线程(128个线程)时,结果不正确,因为如果例如val_max = 1,并且三个线程(带有vector [i] = 5,15和20)将执行代码在下一行,它将是一个数据竞赛..
所以,我不知道使用c ++ 11中的可用函数解决问题的最佳方法(我不能使用互斥锁,锁),保护整个代码。
有什么建议吗?提前谢谢!
答案 0 :(得分:3)
您需要描述需要解决的更大问题,以及为什么需要多个线程。
如果您有大量数据并希望找到最大值,并且您想要分解该问题,那么您做错了。如果所有线程都试图访问共享最大值,那么不仅难以正确使用,而且当你正确使用它时,你已经完全序列化了访问,从而使整个事情成为一个增加复杂性和线程开销的练习程序
使它并行的正确方法是给每个线程一个数组的块来处理(并且数组成员不是原子),线程为此计算局部最大值,然后当所有线程完成时有一个线程找到单个结果的最大值。
答案 1 :(得分:1)
val_max
进行原子提取。vector[i]
,请停止,您已完成。val_max
与您在步骤1中读取的值进行比较,如果比较,则将其替换为vector[i]
的值。