我想在线程之间传达一些信息。原子听起来像是要使用的东西。我看看这个。并发现一个简单的结构像
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 有什么要求?或者只是这个设置中缺少一些东西?
与往常一样,文档是您的朋友:
主
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.
如果它仍然不起作用,你可能有一个编译器错误。