Я узнал, что один из способов общения между потоками — совместное использование некоторой атомарной структуры данных. Например:
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
тривиально копируется?
std::atomic<T>
требует, чтобыT
можно было легко скопировать. - person alter igel   schedule 31.08.2020Point
легко копируется. - person Benny K   schedule 31.08.2020Point::operator=(Point const &)
? Вы объявилиPoint
простой структурой, так что это не похоже на минимально воспроизводимый пример. Кроме того, ваш заголовок по-прежнему говорит о неизменности. Это действительно то, что вы имели в виду? - person Peter Cordes   schedule 01.09.2020xchg
для его неявного поведенияlock
. godbolt.org/z/sdTEv9 - person Peter Cordes   schedule 01.09.2020Point
— это неизменяемый тип, поскольку целые числаx
иy
являются постоянными, и по этой причине оператор присваивания неявно удаляется. Пример воспроизводим, как вы сами заметили. И приятно видеть, что это оптимизировано до одной командыxchg
, но это не имеет ничего общего с исходным вопросом. - person Benny K   schedule 01.09.2020const
в объявлении. - person Peter Cordes   schedule 01.09.2020std::atomic<std::string>
будет работать, когда он прошел компиляцию. Вы можете вызыватьmemcpy
дляstruct Point
с точки зрения типов и правильности константы (целевой объект типаstruct Point
не является константой), но поведение может быть определено или не определено в зависимости от интерпретации слов каждого стандарта. - person curiousguy   schedule 09.09.2020