锁定自由编程 - c ++ atomic

时间:2013-12-11 15:56:54

标签: c++11 atomic lock-free

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

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

2 个答案:

答案 0 :(得分:3)

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

如果您有大量数据并希望找到最大值,并且您想要分解该问题,那么您做错了。如果所有线程都试图访问共享最大值,那么不仅难以正确使用,而且当你正确使用它时,你已经完全序列化了访问,从而使整个事情成为一个增加复杂性和线程开销的练习程序

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

答案 1 :(得分:1)

  1. val_max进行原子提取。
  2. 如果获取的值大于或等于vector[i],请停止,您已完成。
  3. 进行原子比较交换 - 将val_max与您在步骤1中读取的值进行比较,如果比较,则将其替换为vector[i]的值。
  4. 如果比较成功,请停止,您已完成。
  5. 转到第1步,你与另一个推进前进的线程竞争。