volatile关键字不能保证多线程安全。volatile仅告诉编译器不要对该变量的访问进行优化(如缓存到寄存器),确保每次读写都直接访问内存,但它有以下局限性:
- 不保证原子性:对volatile变量的复合操作(如i++)仍然不是线程安全的。
- 不提供内存屏障:volatile不能防止CPU缓存导致的可见性问题,也不能阻止CPU指令重排。
- 仅阻止编译器对volatile变量间的重排:volatile变量和非volatile变量之间的操作仍可能被重排。
在多线程编程中,应该使用std::atomic或适当的同步原语(如互斥锁、内存屏障)来保证线程安全。volatile主要适用于硬件寄存器映射或中断服务例程等场景。




