我看到 volatile
关键字并不适用于线程同步,实际上在这些情况下根本不需要使用它。
虽然我知道仅使用该关键字是不够的,但我不明白为什么完全没有必要使用它。
例如,假设我们有两个线程,线程 A 仅从共享变量读取,线程 B 仅向共享变量写入。通过正确的同步(如 pthreads 互斥锁)进行强制执行。
如果没有使用 volatile
关键字,则编译器可能会查看线程 A 的代码并说:“此处似乎未修改变量,但我们有很多读取;让我们只读取一次,缓存值并优化掉所有后续读取。” 它还可能查看线程 B 的代码并说:“我们在此处有大量写入此变量,但没有读取;因此,不需要写入所写的值,并且因此让我们优化掉所有写入。”
这两种优化都是不正确的。而 两种 其中一种 可以通过使用 volatile 关键字来防止。因此,我可能会得出结论,尽管volatile
不能用于同步线程,但对于任何在线程之间共享的变量仍然是必要的。 (注意:我现在已经阅读到实际上不需要使用 volatile
来防止写入优化;因此我无法想出如何防止这种不正确的优化)
我知道我的理解是错误的。但为什么?