Я думаю, вы неправильно понимаете (очень расплывчатое) использование здесь слов «атомный» и «изменчивый».Атомный только означает, что слова будут читаться или записываться атомарно (за один шаг, и гарантируя, что содержимое этой позиции памяти всегда будет одной записью или другой, а не чем-то промежуточным).И ключевое слово volatile
указывает компилятору никогда не принимать данные в этом месте из-за более раннего чтения / записи (в основном, никогда не оптимизировать чтение).
Что такое слова «атомарный» и «изменчивый»НЕ означает, что существует какая-либо форма синхронизации памяти.Ни один из них не подразумевает НИКАКИХ барьеров или ограждений для чтения / записи.Ничего не гарантируется в отношении согласованности памяти и кэша.Эти функции в основном являются атомарными только на уровне программного обеспечения, и аппаратное обеспечение может оптимизировать / использовать все, что сочтет нужным.
Теперь о том, почему достаточно простого чтения: модели памяти для каждой архитектуры различны.Многие архитектуры могут гарантировать атомарное чтение или запись данных, выровненных с определенным смещением в байтах, или длиной x слов и т. Д., И варьируются от процессора к процессору.Ядро Linux содержит множество определений для различных архитектур, которые позволяют ему обходиться без каких-либо атомарных вызовов (CMPXCHG
, в основном) на платформах, которые гарантируют (иногда даже только на практике, даже если в действительности их спецификация говорит, что на самом деле не гарантирует) атомарныйчитает / пишет.
Что касается volatile
, то в общем случае в этом нет необходимости , если только вы не обращаетесь к IO с отображением в памяти, все зависит от того, когда / где /почему вызываются макросы atomic_read
и atomic_write
.Многие компиляторы будут (хотя это не установлено в спецификации C) генерировать барьеры / ограждения памяти для изменчивых переменных (GCC, вне моей головы, это одно. MSVC это точно.).Хотя это обычно означает, что все чтения / записи в эту переменную теперь официально освобождены практически от любых оптимизаций компилятора, в этом случае путем создания "виртуальной" изменчивой переменной только этой конкретнойэкземпляр для чтения / записи запрещен для оптимизации и переупорядочения.