Multhithread在现代CPU中的旧遗留应用程序

时间:2017-12-23 04:36:29

标签: c++ c multithreading

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

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

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

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

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

相关问题