Почему std:: atomic не копируются?

Кажется, что типы std::atomic не копируются конструктивно или копируются. Почему?

Есть ли техническая причина, почему копирование атомных типов невозможно? Или интерфейс ограничен с целью избежать какого-то плохого кода?

Ответ 1

  • Техническая причина. Большинство атомных типов не гарантируется блокировкой. Представление атомного типа, возможно, должно содержать встроенные мьютекс, а мьютексы не могут быть скопированы.

  • Логическая причина: что бы это означало для копирования атомного типа? Ожидается ли, что вся операция копирования будет атомарной? Будет ли копия и оригинал представлять один и тот же атомный объект?

Не существует четко определенного значения для операции, охватывающей два отдельно атомных объекта, которые сделают это стоящим. Единственное, что вы можете сделать, это передать значение, загруженное из одного атомарного объекта в другое. Но загрузка напрямую синхронизируется только с другими операциями над первым объектом, тогда как хранилище синхронизируется с операциями над объектом назначения. И каждая часть может иметь полностью независимые ограничения порядка памяти.

Выделение такой операции, как загрузка, за которой следует магазин, делает это явным, в то время как задание оставляет вопрос, как он относится к свойствам доступа к памяти участвующих объектов. Если вы настаиваете, вы можете добиться аналогичного эффекта, объединив существующие преобразования std::atomic<..> (требуется явный листинг или другое промежуточное звено типа значения).

.

Ответ 2

На платформах без атомных инструкций (или без атомных инструкций для всех целых размеров) типы, возможно, должны содержать мьютекс для обеспечения атомарности. Мьютексы обычно не могут копироваться или перемещаться.

Чтобы поддерживать согласованный интерфейс для всех специализаций std::atomic<T> на всех платформах, типы никогда не могут быть скопированы.