GCC 中普通可复制类型的原子对象

Atomic objects of trivially copyable types in GCC

根据 C++ 标准,std::atomic 可以与任何普通可复制类型组合。但是,GCC 会产生以下错误消息:

#include <atomic>
struct TriviallyCopyableType {
  int a, b, c, d;
};
int main() {
  std::atomic<TriviallyCopyableType> a;
  a.store({});      // undefined reference to `__atomic_store_16'
  a.is_lock_free(); // undefined reference to `__atomic_is_lock_free'
}

Clang 和微软的编译器不要抱怨。难道我做错了什么?这是一个已知问题吗?毕竟,原子操作是多年前在 GCC 4.4 中实现的。除了使用不同的编译器之外,还有其他解决方法吗?由于 Clang 实现 std::atomic<TriviallyCopyableType> 甚至无锁,我不想使用显式锁定。

此答案根据评论整理而成。

您需要通过在命令行上指定 -latomic 来显式 link 程序中的原子操作库。

-mcx16 可以对 128 位数据类型启用无锁原子操作。