C++ 记忆障碍,不确定我是否可以使用relaxed?

C++ 记忆障碍,不确定我是否可以使用relaxed?,c++,multithreading,c++11,atomic,compare-and-swap,C++,Multithreading,C++11,Atomic,Compare And Swap,使用伪代码,我有两个线程都试图首先访问和“弹出”相同的数据: 螺纹1 DataBlock db = memoryLocationX.reserveBlock(); 螺纹2 DataBlock anotherDB = memoryLocationX.reserveBlock(); 并且reserveBlock()对内存执行std::exchange(),返回原始值并替换为空值,因此只有一个线程可以获取数据: DataBlock reserveBlock(){ return DataBl

使用伪代码,我有两个线程都试图首先访问和“弹出”相同的数据:

螺纹1

DataBlock db = memoryLocationX.reserveBlock();
螺纹2

DataBlock anotherDB = memoryLocationX.reserveBlock();
并且
reserveBlock()
对内存执行std::exchange(),返回原始值并替换为空值,因此只有一个线程可以获取数据:

DataBlock reserveBlock(){
    return DataBlock(_internalState.exchange(EMPTY_VALUE));
}

我的问题是,在什么情况下可以使用
std::memory\u order\u released
作为
exchange()
的第二个参数?我要确保的是,只有一个线程检索存储在_internalState中的数据。但是exchange()已经实现了这一点,所以这是否意味着我可以使用
std::memory\u order\u released

使用
std::memory\u order\u released
您没有得到任何保证,只是不会有数据竞争。它避免了未定义的行为,但很少有真正有用的情况(例如,如果您可以通过其他方式保证同步)

在您的示例中,您需要在线程之间进行同步,因此如果您使用放松语义,您仍然需要显式地进行同步。否则,不能保证其他线程看到修改


最后,它很可能不会更快,代码也会更复杂。

单词“内存顺序障碍”没有任何意义。不是你想象的那样。您可能已经想到了。轻松排序对于读-修改-写(RMW)操作没有意义。RMW操作在内存模型中享有特殊的地位。不是在注释中:-)读1.10?它解释了RMW操作如何适应发布序列和供应同步。如果你不确定,那么你不应该使用放松原子。句点。@user997112第一个线程获取数据并写入空值后,第二个线程调用reserveBlock后必须看到更改。在C++内存模型中,第一个线程必须“释放”内存,第二个线程必须“缓存”它,所以它将被同步。在宽松的顺序中,这不会发生。因此,第二个线程可能保留与第一个块相同的块(->争用条件)。啊,我理解,我们需要将“结果”刷新到所有其他内核。