gpt4 book ai didi

c++ - 仅使用 volatile 修复 DCLP

转载 作者:太空狗 更新时间:2023-10-29 21:40:34 24 4
gpt4 key购买 nike

我正在阅读解释 DCLP 中问题的文章“C++ and the Perils of Double-Checked Locking”。

文章的第二部分(链接转发的地方)展示了如何尝试仅使用 C/C++ volatile 解决 DCLP(据我所知,这是不可能的)。在文章中,作者解释了如何做到这一点(最后一个例子是数字 11),但他们写道:

Unfortunately, all this does nothing to address the first problem—C++'s abstract machine is single threaded, and C++ compilers may choose to generate thread-unsafe code from source like that just mentioned, anyway. Otherwise, lost optimization opportunities lead to too big an efficiency hit. After all this, we're back to square one. But wait, there's more—more processors.

这意味着(如果我理解正确的话)无论我们使用 volatile 多好,它都不会工作,因为“C++ 的抽象机是单线程的,C++ 编译器可能会选择生成线程- 来自源代码的不安全代码就像刚才提到的那样"

但是“C++ 的抽象机是单线程的”是什么意思?!

为什么上述所有这些 volatile 物质的示例都不会阻止重新排序?

谢谢!

最佳答案

自 C++11 起,您的粗体标记句子不再为真。

过去是什么意思:
操作系统/设备可能支持多线程,包括启动它们的函数等。
另一方面,C++ 编译器等“认为”单线程环境,并且不知道使用多线程时可能出现的问题。线程启动只是对它们的正常函数调用,并且操作系统对进程做了一些奇怪的事情,因为该调用既不为人所知也不有趣。

单线程环境中的代码重新排序是可能的,只要重新排序的代码部分彼此独立(例如,写入/读取变量的顺序使得使用该变量的代码依赖)。在多线程环境中,编译器不可能知道变量是否以及何时受到另一个线程的影响...

现在,在 C++11/C++14 中,有独立于操作系统的支持
用于防止优化破坏线程代码。

关于c++ - 仅使用 volatile 修复 DCLP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30817671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com