Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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++ 对于add/sub/inc/dec,使用std::memory\u order\u acq\u rel和一个原子变量是否足够?_C++_Multithreading_C++11_Arm_Lock Free - Fatal编程技术网

C++ 对于add/sub/inc/dec,使用std::memory\u order\u acq\u rel和一个原子变量是否足够?

C++ 对于add/sub/inc/dec,使用std::memory\u order\u acq\u rel和一个原子变量是否足够?,c++,multithreading,c++11,arm,lock-free,C++,Multithreading,C++11,Arm,Lock Free,众所周知,当我们仅使用一个原子变量来存储或加载它时,使用发布-获取顺序就足够了: 但是,对于其他基本的无等待函数,例如:加法、减法、增量和减量,这是真的吗 即,对于弱(ARM CPU,…)和强(x86 CPU,…)内存模型,下面的C++代码中的代码< > NEXT(/Cord>)函数线程安全,还是需要另一个屏障排序(低/高)? #包括 #包括 使用名称空间std; 类级数{ 公众: 级数_lf():n(0){ int next(){ //内存顺序足够,并提高弱内存模型的性能:arm。。。 int

众所周知,当我们仅使用一个原子变量来存储或加载它时,使用发布-获取顺序就足够了:

但是,对于其他基本的无等待函数,例如:加法、减法、增量和减量,这是真的吗

即,对于弱(ARM CPU,…)和强(x86 CPU,…)内存模型,下面的C++代码中的代码< > NEXT(/Cord>)函数线程安全,还是需要另一个屏障排序(低/高)?

#包括
#包括
使用名称空间std;
类级数{
公众:
级数_lf():n(0){
int next(){
//内存顺序足够,并提高弱内存模型的性能:arm。。。
int const current\u n=n.fetch\u add(1,std::memory\u order\u acq\u rel);
int结果=2+(当前n-1)*3;
返回结果;
}
bool是_lock_free(){return ATOMIC_INT_lock_free;}
私人:
std::原子n;
};
int main(){
//参考(单线程)
对于(int n=0;n<10;++n){

STD::Couth

如果你的线程不需要超过一个唯一的数字,恐怕你不需要任何C++内存排序,如果你的线程不需要超过一个唯一的数字。Atomicity就足够了, STD::MeMyYyOrthOrthPosivy//Cuth>保证:

轻松操作:没有同步或排序约束,此操作只需要原子性

尽管事实上,带有原子读修改写操作的代码仍然会在x86上生成硬件指令,这意味着内存已满


您可以看到不同的编译器为不同的平台生成了什么。

非常感谢,并特别感谢您的链接。Intel通过锁定(部分)内存来实现原子RMW,这只能由多个内核通过序列化RMW周围的所有内存操作来完成:任何较弱的变体都可能失败并死锁。
#include <iostream>
#include <atomic>
using namespace std;

class progression_lf {
 public:
 progression_lf() : n(0) {}

 int next() {
    // memory_order_acq_rel - enough, and increases performance for the weak memory models: arm, ...
    int const current_n = n.fetch_add(1, std::memory_order_acq_rel);
    int result = 2 + (current_n - 1)*3;
    return result;
 }

 bool is_lock_free() { return ATOMIC_INT_LOCK_FREE; }

 private:
 std::atomic<int> n;
};

int main() {

    // reference (single thread)
    for(int n = 0; n < 10; ++n) {
        std::cout << (2+(n-1)*3) << ", ";
    }
    std::cout << std::endl;

    // wait-free (multi-thread safety)
    progression_lf p;
    for(int n = 0; n < 10; ++n) {
        std::cout << (p.next()) << ", ";
    }
    std::cout << std::endl; 

    std::cout << "lock-free & wait-free: " << 
        std::boolalpha << p.is_lock_free() << 
        std::endl;

    return 0;
}