c++ compare_exchange_strong|weak使用小陷阱

下面代码输出的是什么

示例一

struct B {
    atomic_int y;
    B() : y(0) {}
};

struct A {
    B *b;
    int x;
    A():x(0){}

};

int main() {
    A a;
    a.b = new B;

    atomic<A> x;
    x.exchange(a);

    auto a1 = x.load();
    auto a2 = x.load();
    a1.b->y.fetch_add(1);
    if (x.compare_exchange_strong(a1, a2)) {
        cout << "eq" << endl;
    }
}

答案是什么也不输出, 这个有一点出乎意料了

下面输出什么

示例二

struct B {
    atomic_int y;
    B() : y(0) {}
};

struct A {
    B *b;
    // int x;
    A(){}

};

int main() {
    A a;
    a.b = new B;

    atomic<A> x;
    x.exchange(a);

    auto a1 = x.load();
    auto a2 = x.load();
    a1.b->y.fetch_add(1);
    if (x.compare_exchange_strong(a1, a2)) {
        cout << "eq" << endl;
    }
}

答案是输出eq
这二者有什么差异呢, 我们仅仅将 int x 注释掉了

揭露真相之旅

compare_exchange_strong|weak 在比较相等时用的是
memcpy 逐位比较

但是a1 和 x 逐位比较也应该想等才对呀,那问题出现在哪里呢

答案是:内存对齐导致的额外的padding
示例一 内存不对齐的大小是 8 + 4 = 12B
但是因为内存对齐导致其大小为 16B
memcpy 比较了16, 有4个字节的内容是未知的

解决问题方法

1、将上面的int x 改成 long long x, 这样就不会有4字节的填充

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: compare_exchange_weakC++11中的一个原子操作函数,用于比较并交换操作。它可以在多线程环境下保证数据的原子性,避免出现数据竞争的情况。与compare_exchange_strong相比,它的弱版本在交换操作失败时不会抛出异常,而是返回一个bool值表示操作是否成功。 ### 回答2: compare_exchange_weakC++中的原子操作函数之一。它的作用是比较给定的值和内存中的值,如果相等,则将内存中的值替换为一个新的值。 compare_exchange_weak函数的使用方式如下: ``` bool compare_exchange_weak(T& expected, T desired); ``` 其中,expected是一个引用参数,表示期望的值;desired是新的值。函数首先比较内存中的值和expected,如果相等,则将内存中的值替换为desired并返回true;如果不相等,则将内存中的值赋给expected并返回false。 compare_exchange_weak函数是弱的比较和替换原子操作。之所以称为"弱",是因为它在比较和替换期间可能会受到其他线程的干扰,需要重试。这种重试可以保证代码的正确性,但可能会影响性能。 与之相对的是compare_exchange_strong函数,它是"强"的比较和替换原子操作。compare_exchange_strong函数不需要重试,因此使用起来更简单,但有可能导致不必要的循环开销。 需要注意的是,compare_exchange_weak函数的返回值不仅表示比较和替换的结果,还表示内存中的值是否被替换。因此,在使用该函数时,需要根据返回值判断操作是否成功。 总之,compare_exchange_weakC++中的原子操作函数,用于比较给定值和内存中的值,并在相等时替换。它是一种弱的比较和替换操作,可能需要重试以保证正确性。 ### 回答3: compare_exchange_weak是一种原子操作,其目的是在多线程环境下实现对共享变量的原子比较和交换操作。在C++中,compare_exchange_weak函数通常与一个参数一起使用,该参数用于表示预期值。此函数会比较共享变量的值与预期值是否相等,如果相等,则将共享变量的值修改为新值,返回true;如果不相等,则不进行修改,返回false。 与compare_exchange_strong函数相比,compare_exchange_weak函数在性能上可能略有优势,但在并发度较高的情况下,可能会出现一些问题,因为它可能会被其他线程中断,导致原子操作失败。在这种情况下,函数会返回false,但同时还会返回共享变量的当前值,并将预期值修改为当前值。 compare_exchange_weak函数通常与循环结合使用,以确保原子操作的成功。在循环中,可以不断尝试进行原子操作,直到成功为止。这种方法可以有效地避免由于竞态条件而导致的共享变量值的错误结果。 总而言之,compare_exchange_weak函数是一种用于实现原子比较和交换操作的方式。尽管它在某些情况下可能会失败,但通过循环的方式,我们可以确保操作的成功,并保证共享变量的一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值