std::atomic<T>::operator= 是如何为不可变类型实现的?
How is std::atomic<T>::operator= implemented for immutable types?
我了解到线程间通信的一种方式是共享一些原子数据结构。例如:
struct Point {
int const x, y;
};
std::atomic<Point> some_point_in_shared_memory{Point{0, 0}};
尽管 Point::operator=(Point const &)
被删除,但似乎 no problem 调用了 std::atomic<Point>
的赋值运算符,如下所示:
some_point_in_shared_memory = Point{1, 2};
如何实现这个操作?
我可能想到的一个解决方案是使用 placement new
在旧对象之上构造一个新对象,但显然 it is not exception safe。还是因为 Point
是可平凡复制的?
来自cppreference:
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
你的T
不是CopyAssignable,这一行
some_point_in_shared_memory = Point{1, 2};
是ill-formed。应该有编译错误。不幸的是,我没有让 GCC 发出错误或警告(-pedantic -Wpedantic -pedantic-errors -Wall -Werror=pedantic
无效)。
我了解到线程间通信的一种方式是共享一些原子数据结构。例如:
struct Point {
int const x, y;
};
std::atomic<Point> some_point_in_shared_memory{Point{0, 0}};
尽管 Point::operator=(Point const &)
被删除,但似乎 no problem 调用了 std::atomic<Point>
的赋值运算符,如下所示:
some_point_in_shared_memory = Point{1, 2};
如何实现这个操作?
我可能想到的一个解决方案是使用 placement new
在旧对象之上构造一个新对象,但显然 it is not exception safe。还是因为 Point
是可平凡复制的?
来自cppreference:
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
你的T
不是CopyAssignable,这一行
some_point_in_shared_memory = Point{1, 2};
是ill-formed。应该有编译错误。不幸的是,我没有让 GCC 发出错误或警告(-pedantic -Wpedantic -pedantic-errors -Wall -Werror=pedantic
无效)。