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
。
如果它仍然不起作用,您可能有一个编译器错误。
我想在线程之间传递一些信息。 原子听起来像是可以使用的东西。 我看过 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 isfalse
:
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
。
如果它仍然不起作用,您可能有一个编译器错误。