无锁编程-c++原子



我正在尝试开发以下无锁代码(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中的可用函数(我不能使用互斥、锁)来保护整个代码的最佳方法。

有什么建议吗?提前感谢!

您需要描述需要解决的更大问题,以及为什么需要多个线程来解决这个问题。

如果你有很多数据,想要找到最大值,并且你想要拆分这个问题,那你就错了。如果所有线程都试图访问一个共享的最大值,不仅很难做到正确,而且当你做到正确时,你已经完成了完全序列化的访问,从而使整个过程成为向串行程序添加复杂性和线程开销的练习。

使其并行的正确方法是给每个线程一个要处理的数组块(数组成员不是原子),线程为此计算一个局部最大值,然后当所有线程都完成时,让一个线程找到单个结果的最大值。

  1. 执行val_max的原子提取
  2. 如果获取的值大于或等于vector[i],则停止,完成
  3. 进行原子比较交换——将val_max与步骤1中读取的值进行比较,如果进行比较,则将其交换为vector[i]的值
  4. 如果比较成功,停止,您就完成了
  5. 转到第1步,您使用了另一个向前推进的线程

相关内容

  • 没有找到相关文章

最新更新