首页 > 解决方案 > 如何以原子方式递增或递减非 std::atomic 整数类型

问题描述

所以在 C++ 中,假设我有以下 16 字节类型,它可以在具有cmpxchg16b指令的 CPU 上进行原子操作:

#include <atomic>
#include <cstdio>

struct foo
{
    size_t _x;
    void* _y;

    foo(size_t x = 3, void* y = nullptr): _x(x), _y(y){}
};

int main()
{
    std::atomic<foo> f1;
    foo f2;
    foo f3(2, new int(4));
    f1.compare_exchange_strong(f2, f3);
    std::printf("is always lock free %s\n", std::atomic<foo>::is_always_lock_free ? "true" : "false" );
}

但是,假设我可能只想在 上进行原子增量_x,例如 via fetch_add。我如何在不必使用的情况下应用这样的原子操作std::atomic<size_t>?我不想在这里使用它的原因是因为较大的foo类型变得不可轻易复制,并阻止我使用 16 字节的比较和交换,给出以下错误:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/atomic:923:3: error: 
      _Atomic cannot be applied to type 'foo' which is not trivially copyable
  _Atomic(_Tp) __a_value;

所以我正在寻找一种方法来做类似的事情,

foo a1;
fetch_add(&a1._x);

标签: c++stdatomic

解决方案


推荐阅读