我正在尝试开发以下无锁代码(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中的可用函数(我不能使用互斥、锁)来保护整个代码的最佳方法。
有什么建议吗?提前感谢!
您需要描述需要解决的更大问题,以及为什么需要多个线程来解决这个问题。
如果你有很多数据,想要找到最大值,并且你想要拆分这个问题,那你就错了。如果所有线程都试图访问一个共享的最大值,不仅很难做到正确,而且当你做到正确时,你已经完成了完全序列化的访问,从而使整个过程成为向串行程序添加复杂性和线程开销的练习。
使其并行的正确方法是给每个线程一个要处理的数组块(数组成员不是原子),线程为此计算一个局部最大值,然后当所有线程都完成时,让一个线程找到单个结果的最大值。
- 执行
val_max
的原子提取 - 如果获取的值大于或等于
vector[i]
,则停止,完成 - 进行原子比较交换——将
val_max
与步骤1中读取的值进行比较,如果进行比较,则将其交换为vector[i]
的值 - 如果比较成功,停止,您就完成了
- 转到第1步,您使用了另一个向前推进的线程