c++ - 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 有什么要求?或者只是这个设置中缺少一些东西?
解决方案
与往常一样,文档是您的朋友:
可以使用满足CopyConstructible和CopyAssignable的任何TriviallyCopyable
std::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
.
如果它仍然不起作用,则您可能有编译器错误。
推荐阅读
- swift - 更改我的 ObservableObject 实例的属性不会更新 View。代码:
- c# - C# textfile 创建/删除同一行中的文本间距
- bash - curl post命令的shell脚本有什么问题
- c# - 在 Microsoft.Azure.Cosmos.Table 中使用 TableEntity.Flatten 的正确方法是什么?
- rest - 需要反馈 REST URL 的质量
- php - 一个很奇怪的问题,windows10自动升级后无法用WAMP访问Localhost
- sql - 使用 NEAR 选择查询?
- c++ - 如何在 vs 代码的输出中输入输入?
- python - 如果列中的字符串中的单词包含字符,则将其复制到特定列,否则所有其他单词进入不同的列
- typescript - 使用 Vuex 和 Composition API,有没有办法访问响应式属性?