1

我了解到线程之间进行通信的一种方法是共享一些原子数据结构。例如:

struct Point {
    int const x, y;
};

std::atomic<Point> some_point_in_shared_memory{Point{0, 0}};

尽管已被删除,但调用赋值运算符Point::operator=(Point const &)似乎没有问题std::atomic<Point>,如下所示:

some_point_in_shared_memory = Point{1, 2};

这个操作如何实现?

我可能会考虑的一种解决方案是placement new在旧对象之上构造一个新对象,但显然它不是异常安全的。还是因为Point可以轻松复制而可以?

4

1 回答 1

7

cppreference

主 std::atomic 模板可以用任何同时满足 CopyConstructible 和 CopyAssignable 的 TriviallyCopyable 类型 T 来实例化。如果以下任一值为假,则程序为非良构:

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};

格式不正确。应该有编译器错误。不幸的是,我没有让 GCC 发出错误或警告(-pedantic -Wpedantic -pedantic-errors -Wall -Werror=pedantic无效)。

于 2020-08-31T14:30:47.970 回答