Volatile и std::atomic отличаются при работе с многопоточностью следующим образом:
- Volatile не предназначен для межпоточного взаимодействия. 4 Он используется для работы с памятью, где чтение и запись не следует оптимизировать. 2 Компилятору запрещена любая оптимизация чтения или записи volatile объекта, а это значит, что при чтении всегда будет прочитано последнее записанное значение. 4
- std::atomic обеспечивает атомарный доступ к переменным и предоставляет различные модели доступа к памяти для записи и загрузки, а также набор примитивов для многопоточности. 10 После создания объекта std::atomic операции с ним ведут себя так, как будто они находятся в критической секции, защищенной мьютексом. 2
Таким образом, volatile используется для работы с памятью, а std::atomic — для доступа к данным из нескольких потоков без использования мьютексов. 2