Подводя итог тому, что правильно написали другие:
C / C ++ volatile
для аппаратного доступа и прерываний. C ++ 11 atomic<>
предназначен для связи между потоками (например, в коде без блокировки). Эти два понятия / использования являются ортогональными, но у них есть частично совпадающие требования, и именно поэтому люди часто путают их.
Причина, по которой atomic<>
имеет функции с квалификацией volatile, является той же самой причиной, по которой у него функции с квалификацией const, поскольку в принципе возможно, что объект будет atomic<>
и const
и / или volatile
.
Конечно, как указывалось в моей статье, еще одним источником путаницы является то, что C / C ++ volatile
отличается от C # / Java volatile
(последний в основном эквивалентен C ++ 11 atomic<>
).