Template:cpp/atomic/atomic-vs-volatile
来自cppreference.com
在执行线程中,不能将通过 volatile 左值进行的访问(读和写)重排到同线程内为序列点所分隔的可观测副效应(包含其他 volatile 访问)后,但不保证另一线程观察到此顺序,因为 volatile 访问不建立线程间同步。
另外,volatile 访问不是原子的(共时的读和写是数据竞争),且没有内存定序(非 volatile 内存访问可以自由地重排到 volatile 访问前后)。
一个值得注意的例外是 Visual Studio,其中默认设置下,每个 volatile 写拥有释放语义,而每个 volatile 读拥有获得语义(微软文档),故而可将 volatile 对象用于线程间同步。标准的 volatile 语义不可应用于多线程编程,尽管它们在应用到 sig_atomic_t 对象时,足以用于例如与运行于同一线程的 std::signal 处理函数间的通信。可以使用编译器选项 /volatile:iso 恢复和标准一致的行为,当目标平台是 ARM 时这是默认设置。