我正在阅读文章“ C++ and the Perils of Double-Checked Locking ”,它解释了 DCLP 中的问题。
文章的第二部分(链接转发)展示了如何尝试仅使用 C/C++ volatile 解决 DCLP(据我所知,这是不可能的)。在文章中,作者解释了如何做到这一点(最后一个例子是 11 号),但他们写道:
不幸的是,这一切都无助于解决第一个问题——C++ 的抽象机器是单线程的,而且 C++ 编译器可能会选择从刚才提到的源代码生成线程不安全的代码,无论如何。否则,失去优化机会会导致效率损失过大。毕竟这一切,我们回到第一方。但是等等,还有更多——更多的处理器。
这意味着(如果我理解正确的话),无论我们将如何使用 volatile,它都不会起作用,因为“ C++ 的抽象机器是单线程的,C++ 编译器可能会选择从源代码生成线程不安全的代码,例如刚才提到的“
但这意味着“C++ 的抽象机器是单线程的”是什么意思?!
为什么上面所有这些挥发物的例子都不会阻止重新排序?
谢谢!