将compre_exchange与 c++20 一起使用会比较值表示吗?(为什么这个例子不同意)



从此链接

将*this的对象表示(直到C++20(值表示(从C++20开始(与预期值表示进行原子比较,如果这些值按位相等,则将前者替换为所需值(执行读取-修改-写入操作(。否则,将*this中存储的实际值加载到预期值中(执行加载操作(。

因此,使用C++20,以下代码中的while循环必须是无限的,但它是有限的。我错了还是发生了什么

#include <atomic>
#include <iostream>
struct S {
char a{};
int b{};
};
bool operator==(const S& lhs, const S& rhs) {
return lhs.a == rhs.a && lhs.b == rhs.b;
}
int main() {
S expected{ 'a', 2 };
std::atomic<S> atomicS{ S{'a', 2} };
reinterpret_cast<unsigned char*>(&(atomicS))[1] = 'e';
reinterpret_cast<unsigned char*>(&(expected))[1] = 'f';
while (atomicS.compare_exchange_strong(expected, S{ 'a',2 }));
std::cout << "nfinished";
}

演示

这一变化(使用值表示而不是对象表示(是作为P0528R3的一部分完成的(动机和故事可以在P0528R0中找到(。正如您在cppreference的编译器支持下看到的,gcc和clang都还没有实现这个特性。MSVC在19.28上运行,但在编译器资源管理器上不可用,所以我现在无法检查它进行验证。

因此,目前,您正在有效地验证旧的行为。

最新更新