【发布时间】:2010-02-10 08:50:42
【问题描述】:
如果我有以下伪代码:
sharedVariable = somevalue;CreateThread(threadWhichUsesSharedVariable);
理论上,多核 CPU 是否可以在 threadWhichUsesSharedVariable() 中执行代码,该代码在父线程写入之前读取 sharedVariable 的值?为了在理论上完全避免竞争条件的可能性,代码应该看起来像这样:
sharedVariableMutex.lock();sharedVariable = somevalue;sharedVariableMutex.unlock();CreateThread(threadWhichUsesSharedVariable);
基本上我想知道线程的产生是否在那时显式地线性化了 CPU,并且保证会这样做。
我知道线程创建的开销可能需要足够的时间,这在实践中并不重要,但我的完美主义者害怕理论上的竞争条件。在极端条件下,一些线程或内核可能严重滞后,而其他线程或内核运行得又快又高效,我可以想象,除非有锁,否则执行顺序(或内存访问)可能会被逆转。
【问题讨论】:
-
我的问题涉及像 C++ 这样的语言,您接近机器级别,并且使用简单的 InterlockedExchange 循环实现“锁定”。我担心将变量声明为“volatile”不足以确保同步。 “原子”和“同步”之间没有区别吗?原子操作不能被拆分——如果一个变量被声明为 volatile,编译器不会重新排序对它的访问——但是 CPU 不能重新排序它们吗?尤其是当被不同的内核访问时?
-
附加说明:在我的示例中,“sharedVariable = somevalue”用于将数据传递给 threadWhichUsesSharedVariable。 threadWhichUsesSharedVariable 只有在被父线程分配后才访问“sharedVariable”,这一点非常重要。
-
如果重新排序对程序不可见,CPU 只能重新排序访问,因此 CPU 重新排序不应该成为问题。设计多核系统的大部分复杂性在于确保程序永远不会看到与单核系统的行为差异。
标签: multithreading locking thread-safety multicore shared-memory