gpt4 book ai didi

c++ - 线程安全问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:57 26 4
gpt4 key购买 nike

这里有一个简单的情况,如果我有三个线程,一个用于窗口应用程序,我希望它们退出当窗口应用程序关闭时,如果我使用一个全局变量,它是否是线程安全的,这样如果只有全局变量为真,三个线程就会退出,否则继续工作?volatile 在这种情况下有帮助吗?C++ 编程。

最佳答案

理论上,volatile 是不够的。有两个抽象层:

  • 在源代码操作和实际操作码之间;
  • 在核心/处理器看到的内容与其他核心/处理器看到的内容之间。

编译器可以自由地在寄存器中缓存数据并重新排序读写。通过使用 volatile,您指示编译器生成操作码,这些操作码完全按照您在源代码中指定的顺序执行读取和写入。但这只处理第一层。管理处理器内核之间通信的硬件系统可能延迟和重新排序读写。

碰巧在 x86 硬件上,核心将写入传播到主内存的速度相当快,并且其他核心会自动通知内存已更改。所以 volatile 似乎就足够了:它确保编译器不会玩寄存器的时髦游戏,并且内存系统足够好地处理从这一点开始的事情。不过请注意,这并非在所有系统上都是如此(我认为至少某些 Sparc 系统可能会因任意延迟而延迟写入传播——可能是几个小时),而且我在其中一本 AMD 手册中读到了 AMD 明确保留的权利在未来的某些处理器中传播写入的速度会降低。

所以干净的解决方案是在每次访问全局变量(用于读取和用于写作)。互斥原语包括一个称为内存屏障的特殊操作,它就像类固醇上的volatile(它充当两个抽象层的volatile ).

关于c++ - 线程安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2357091/

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