首页 > 解决方案 > MyType 允许 std::atomic 的确切要求是什么?

问题描述

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

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 有什么要求?或者只是这个设置中缺少一些东西?

标签: c++c++11stdatomic

解决方案


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

可以使用满足CopyConstructibleCopyAssignable的任何TriviallyCopyablestd::atomic类型 T来实例化主模板。如果以下任何值是 ,则该程序格式错误: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.

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


推荐阅读