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

6 c++ c++11 stdatomic

我想在线程之间传达一些信息。原子听起来像是要使用的东西。我看看这个。并发现一个简单的结构像

struct MyType{
  int val_a,val_b;
  float vals_c[5];
};
Run Code Online (Sandbox Code Playgroud)

应该填写断言:

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");
Run Code Online (Sandbox Code Playgroud)

)

但是一个简单的程序作为

//... MyType and static_assert

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

无法编译:

undefined reference to `__atomic_store'
undefined reference to `__atomic_load'
Run Code Online (Sandbox Code Playgroud)

我在 64 位 ubuntu 16.04 上使用 gcc 5.4 版。

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

这是完全错误的使用std::atomic吗?MyType 有什么要求?或者只是这个设置中缺少一些东西?

Lig*_*ica 8

与往常一样,文档是您的朋友:

std::atomic模板可以与任何被实例化TriviallyCopyable同时满足T型复制构造CopyAssignable。如果以下任何值是 ,则程序格式错误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

所以,你的断言是好的。

后来它说:

在 gcc 和 clang 上,此处描述的某些功能需要针对-latomic.

因此,如果程序仍然无法构建,您可能需要链接到libatomic.

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

  • @generic_opto_guy:如果您的代码需要“-latomic”,通常意味着您使用了“atomic&lt;T&gt;”,而不是“is_lock_free”。例如,在 x86-64 上大于 8 字节。(或者使用较旧的 gcc 和“-mxc16”,它也将 16 字节结构视为无锁,但即使对于纯加载和存储,它也必须使用“lock cmpxchg16b”,因此读取不会随多个线程扩展。) (2认同)