C++11 无锁编程-c++;原子的
我正在尝试开发以下无锁代码(c++11):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中的可用函数解决这个问题的最佳方法(我不能使用互斥、锁),从而保护整个代码 有什么建议吗?提前谢谢 您需要描述需要解决的更大问题,以及为什
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]
的值进行交换val_max
的原子提取vector[i]
,则停止,即完成val_max
与步骤1中读取的值进行比较,如果比较,则将其与vector[i]
的值进行交换描述您想要实现的目标。也许这将解决您的问题更大的问题是,即使您摆脱了数据竞争,
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];
}