在现代CPU中使用Multhithread旧的遗留应用程序[关闭]

问题描述 投票:-4回答:2

我在解释为​​什么volatile关键字是不同线程访问共享内存结构所必需的。

我的论点是假设CPU内部有两个内核和两个本地缓存。假设一个线程在一个核心中运行,而另一个线程在下一个核心中运行。然后,当第一个线程正在写入该内存,而第二个线程正在读取它时,第二个线程将看不到最新版本,因为它的本地缓存尚未更新。

但我的朋友提出了一个论点,他认为在'volatile'关键字之前会发生什么,旧的多线程应用程序二进制文件在现代处理器中运行并运行,它们会失败吗?例如,旧的32位应用程序在Windows 7中带回并运行在多核CPU中?在没有引入CPU内核的时代编写的应用程序只有单个缓存吗?

我朋友的说法是否正确。或者它会失败吗?什么是'volatile'关键字被引入C / C ++的时间框架?

c++ c multithreading
2个回答
1
投票

对于非常紧密的循环,互斥锁可能还不够。我已经看到了循环是这样的代码,即编译器永远不会重新加载测试变量,有或没有互斥锁(是的,我现在知道在这样的循环中测试互斥锁是一种糟糕的设计)。如果该示例中存在互斥锁,则它会将当前寄存器值转储到堆栈,并在获取互斥锁后重新加载,而不是从原始变量的位置重新加载。在那种情况下使用volatile强制从正确的地址重新加载。没有互斥锁,环路足够紧,没有任何寄存器溢出,因此没有任何易失性,根本没有任何重新加载。


-1
投票

至于你在第一段中的想法。任何使用多个线程的程序都将使用互斥锁,只允许一个线程一次更改一块内存。

通常不需要volatile关键字。当你正在编译的程序控制之外的东西可能会弄乱你在内存中的东西时使用它。

如果您在计算机上运行旧应用程序,它将只使用一个处理器,因此您永远不会遇到任何问题。

使用时,volatile关键字告诉编译器要小心它如何优化代码。不优化代码的某些部分不会破坏任何东西。

© www.soinside.com 2019 - 2024. All rights reserved.