Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 无锁编程-c++;原子的_C++11_Atomic_Lock Free - Fatal编程技术网

C++11 无锁编程-c++;原子的

C++11 无锁编程-c++;原子的,c++11,atomic,lock-free,C++11,Atomic,Lock Free,我正在尝试开发以下无锁代码(c++11): int val_max; std::数组向量; if(向量[i]>val_max){ val_max=向量[i]; } 问题是,当有许多线程(128个线程)时,结果是不正确的,因为如果例如val_max=1,那么三个线程(向量[i]=5、15和20)将在下一行执行代码,这将是一场数据竞争 因此,我不知道用c++11中的可用函数解决这个问题的最佳方法(我不能使用互斥、锁),从而保护整个代码 有什么建议吗?提前谢谢 您需要描述需要解决的更大问题,以及为什

我正在尝试开发以下无锁代码(c++11):

int val_max;
std::数组向量;
if(向量[i]>val_max){
val_max=向量[i];
}
问题是,当有许多线程(128个线程)时,结果是不正确的,因为如果例如val_max=1,那么三个线程(向量[i]=5、15和20)将在下一行执行代码,这将是一场数据竞争

因此,我不知道用c++11中的可用函数解决这个问题的最佳方法(我不能使用互斥、锁),从而保护整个代码


有什么建议吗?提前谢谢

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

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


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

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

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

使其并行化的正确方法是为每个线程提供一个数组块(数组成员不是原子),线程为其计算局部最大值,然后在所有线程完成后,让一个线程找到单个结果的最大值

  • 执行
    val_max
    的原子提取
  • 如果获取的值大于或等于
    vector[i]
    ,则停止,即完成
  • 执行原子比较交换——将
    val_max
    与步骤1中读取的值进行比较,如果比较,则将其与
    vector[i]
    的值进行交换
  • 如果比较成功,停止,则完成
  • 转到步骤1,您与另一个线程进行了比赛,该线程取得了前进
  • 执行
    val_max
    的原子提取
  • 如果获取的值大于或等于
    vector[i]
    ,则停止,即完成
  • 执行原子比较交换——将
    val_max
    与步骤1中读取的值进行比较,如果比较,则将其与
    vector[i]
    的值进行交换
  • 如果比较成功,停止,则完成
  • 转到步骤1,您与另一个线程进行了比赛,该线程取得了前进

  • 描述您想要实现的目标。也许这将解决您的问题更大的问题是,即使您摆脱了数据竞争,
    val_max
    上的争用将成为瓶颈,并扼杀您可能期望从多线程解决方案中获得的所有性能提升。您的算法似乎有缺陷,但由于您没有编写您试图实现的内容,因此很难帮助您修复。请描述您想要实现的内容。也许这将解决您的问题更大的问题是,即使您摆脱了数据竞争,
    val_max
    上的争用将成为一个瓶颈,扼杀您可能期望从多线程解决方案中获得的所有性能提升。您的算法似乎有缺陷,但由于您没有编写您试图实现的内容,因此很难帮助您修复它。正如我之前所写的,这只是一个要求(线程数和无锁)。正如你所说,我给了每个线程一个数组块,但问题是,当有128个线程执行时,有时它们执行同一行,我的值是错误的……它们的关键是给它们局部最大值,最后是聚合。如果你不能有一个单独的线程来总结这一点,你需要使最终的max_val原子化,并使用一个compare_交换循环来设置它。正如你所说,我给了每个线程一个数组块,但问题是,当有128个线程执行时,有时它们执行同一行,我的值是错误的……它们的关键是给它们局部最大值,最后是聚合。如果你不能有一个单独的线程来总结这一点,你需要使最终的最大值原子化,并使用一个比较交换循环来设置它。
    int val_max;
    std::array<std::atomic<int>, 255> vector;
    
        if (vector[i] > val_max) {
        val_max =vector[i];
        }