假设我们有两个线程,一个(我们称之为Tom)接收用户输入并写入一个bool变量。另一个线程(Jerry)读取该变量来决定是否继续循环。我们知道,优化的编译器在编译循环时可能会将变量存储在寄存器中。因此,在运行时,Jerry可能会读取一个过时的值,与Tom实际写入的值不同。因此,我们应该将bool变量声明为volatile。
然而,如果解引用指针总是会导致内存访问,那么这两个线程可以使用指针引用该变量。每次写操作时,Tom将通过解引用指针并写入新值来将新值存储到内存中。每次读取时,Jerry可以通过解引用相同的指针来真正读取Tom写入的值。这似乎比依赖于具体实现的volatile更好。
我对多线程编程还很陌生,所以这个想法可能看起来很琐碎和不必要。但我真的很好奇。
volatile
并不能使变量具有原子性/线程安全性。您需要使用std::atomic
、std::mutex
或类似的方法。 - Jesper Juhlvolatile
并不能使变量具有原子性或线程安全性。你需要使用std::atomic
、std::mutex
或类似的方法。 - Jesper Juhlvolatile
来规避这个问题也已经过时了。自从C++11和C11版本以后,这些语言都包含了支持多线程的内存模型。请使用适当的原语,比如std::atomic
来处理这个问题。 - Homer512volatile
来规避这一点也已经过时了。自从C++11和C11以后,这些语言都引入了包含多线程的内存模型。请使用适当的原语,比如std::atomic
来处理这个问题。 - Homer512std::atomic
、std::mutex
等机制),否则在两个不同的线程上解引用指针会导致未定义的行为。volatile
并不引入同步。如果行为是未定义的,根据标准,编译器无论它做什么(省略操作、以某种形式进行同步执行、使主机崩溃),都是正确的。 - Peter