MyType 允许 std::atomic<MyType> 的确切要求是什么?

What are the exact requirements for MyType to allow std::atomic<MyType>?

我想在线程之间传递一些信息。 原子听起来像是可以使用的东西。 我看过 this。并发现像

这样的简单结构
struct MyType{
  int val_a,val_b;
  float vals_c[5];
};

应该填写断言:

static_assert( 
  std::is_trivially_copyable<MyType>::value &&
  std::is_copy_constructible<MyType>::value &&
  std::is_move_constructible<MyType>::value &&
  std::is_copy_assignable<MyType>::value &&
  std::is_move_assignable<MyType>::value, 
  "MyType is not suitable for std::atomic");

)

但是一个简单的程序如

//... MyType and static_assert

int main(int argc,char *argv[]){
   MyType a;
   std::atomic<MyType> b;
   b = a;
   a = b;
   return 0;
}

编译失败:

undefined reference to `__atomic_store'
undefined reference to `__atomic_load'

我在 64 位 ubuntu 16.04.

上使用 gcc 5.4 版

使用的标志是:-pipe -g -std=gnu++11 -Wall -W -fPIC

这是对 std::atomic 的完全错误使用吗? MyType 有哪些要求?还是此设置中缺少某些内容?

一如既往,documentation是你的朋友:

The primary std::atomic template may be instantiated with any TriviallyCopyable type T satisfying both CopyConstructible and CopyAssignable. The program is ill-formed if any of following values is false:

std::is_trivially_copyable<T>::value
std::is_copy_constructible<T>::value
std::is_move_constructible<T>::value
std::is_copy_assignable<T>::value
std::is_move_assignable<T>::value

所以,你的断言是好的。

后面说:

On gcc and clang, some of the functionality described here requires linking against -latomic.

因此,如果程序仍然无法构建,you may need to link against libatomic

如果它仍然不起作用,您可能有一个编译器错误。