【发布时间】:2010-10-08 05:08:53
【问题描述】:
另一周,我写了一个小线程类和一个单向消息管道来允许线程之间的通信(显然,每个线程有两个管道,用于双向通信)。在我的 Athlon 64 X2 上一切正常,但我想知道如果两个线程都在查看同一个变量并且每个内核上该变量的本地缓存值不同步,我是否会遇到任何问题。
我知道 volatile 关键字会强制变量从内存中刷新,但是在多核 x86 处理器上是否有办法强制所有内核的缓存同步?这是我需要担心的事情吗,或者 volatile 和正确使用轻量级锁定机制(我使用 _InterlockedExchange 来设置我的 volatile 管道变量)会处理我想要编写“无锁”的所有情况多核 x86 CPU 的代码?
我已经知道并使用了关键部分、互斥体、事件等。我主要想知道是否存在我不知道的 x86 内在函数或可用于强制缓存一致性。
【问题讨论】:
-
您想要跨平台的东西还是在 Windows 或 Linux 上?
-
现在可能只是 Windows。代码库可能会扩展到 MacOS、WinMobile 以及 iPhone 在某些时候使用的任何东西,但最初的开发是在 Win32/64 下。
-
这是一个常见的误解,volatile 并不意味着“从内存中刷新”。查看 Fedor Pikus 的关于无锁的视频,他也描述了“不稳定”。 youtu.be/lVBvHbJsg5Y?t=16m17s
标签: c++ multithreading x86 multicore cpu-cache