C++ 比较和交换原子变量

C++ 比较和交换原子变量,c++,c++11,atomic,C++,C++11,Atomic,我有代码(已更新以更正union结构排序): 我该怎么做?比较_exchange_weak(),x的参数不能是原子的-所以我很困惑?局部变量x不应该是原子的。没有理由这样做,也不能将其用作compare\u exchange\u weak的参数,该参数需要一个常规值 我不会评论你试图对联合体做的任何事情,因为这对我来说毫无意义。我认为你的结构和联合体的嵌套顺序不对。联合两个shorts没有任何意义。而且,compare\u exchange\u weak也没有将一个原子的作为参数。@Snefte

我有代码(已更新以更正union结构排序):


我该怎么做?比较_exchange_weak(),
x
的参数不能是原子的-所以我很困惑?

局部变量
x
不应该是原子的。没有理由这样做,也不能将其用作
compare\u exchange\u weak
的参数,该参数需要一个常规值


我不会评论你试图对联合体做的任何事情,因为这对我来说毫无意义。

我认为你的
结构和
联合体的嵌套顺序不对。联合两个
short
s没有任何意义。而且,
compare\u exchange\u weak
也没有将一个
原子的
作为参数。@Sneftel b和c应该由dSo一起表示,我怎样才能在原子上一起交换b和c?这意味着
b
c
应该在一个结构中,与
d
联合。我把联合搞错了。我想同时交换两个16位变量b和c中的32位?@user997112:那么,在访问
b
c
时要非常小心,因为联合绕过了
d
的原子性质,很难避免数据竞争。最好以原子方式读取
d
,然后提取所需值的任何部分。此结构存储在另一个容器中。我是否应该将结构声明为原子结构,所以是原子结构,然后忘记与原子变量的联合?@user997112:我当然会忘记联合。原子整数可能比原子结构更好,因为它更可能是无锁的。
union A {
    struct {
         short b;
         short c;
    };

    std::atomic<int> d;
}
A a;
.
.
.
std::atomic<int32_t> x = a.d.load(std::memory_order_relaxed);
int32_t valToReplace = 0;

return a.d.compare_exchange_weak(valToReplace, x, std::memory_order_release, std::memory_order_relaxed);