C ++ 11 Потоковая безопасность std :: atomic & lt; T & gt; копировать конструкторы

Я проходил через некоторые проблемы с моим атомным контейнером и увидел эта ссылка.

Есть ли причина, по которой std :: atomic не копируется? Решение, кажется, этот где они просто проходят T значение для неатомарного конструктора с функцией атомарной нагрузки (если я не ошибаюсь).

Так в общем, безопасен ли этот поток конструктора копирования?

template<typename T>
struct MobileAtomic
{
std::atomic<T> atomic;

explicit MobileAtomic(std::atomic<T> const& a) : atomic(a.load()) {}

};

1

Решение

Есть ли причина, по которой std :: atomic не копируется?

да.

Когда вы просите копию конструктив atomicвы запрашиваете «нормальные» правила однопоточной последовательной согласованности для применения к переменной, которая не следует этим правилам.

По сути, нет обобщенного решения.

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

4

Другие решения