是否存在某些只有真正并发时才会发生的竞争条件?
Are there some race conditions that can happen only with true concurrency?
如果你有一台单核计算机,你很容易陷入线程代码的各种麻烦中。例如你有:
class A
{
int always_even = 0;
public:
void doSomething()
{
always_even++;
always_even++;
}
}
然后线程 1 可以通过第一个增量然后被换出,另一个线程会发现 A
违反了不变量。
但是,我对这个问题很感兴趣,是否存在一些竞争条件或并发错误仅在具有真正并行性的架构上表现出来,即两个或多个线程同时执行相同的物理时间?
要查找的关键字是 内存屏障 和 内存模型(或者更通用的术语 - 一致性模型 )。简而言之,当线程在单个内核上切换时,每个线程都会看到相同的读取和写入顺序。如果有不同的 cores/CPUs 和不同的现金,每个现金的读写顺序可能看起来不同。一旦算法依赖于内存访问顺序,使用它的程序可能会在 multi-core/multi-CPU 机器上出现故障,但在单核机器上永远不会失败。
如果你有一台单核计算机,你很容易陷入线程代码的各种麻烦中。例如你有:
class A
{
int always_even = 0;
public:
void doSomething()
{
always_even++;
always_even++;
}
}
然后线程 1 可以通过第一个增量然后被换出,另一个线程会发现 A
违反了不变量。
但是,我对这个问题很感兴趣,是否存在一些竞争条件或并发错误仅在具有真正并行性的架构上表现出来,即两个或多个线程同时执行相同的物理时间?
要查找的关键字是 内存屏障 和 内存模型(或者更通用的术语 - 一致性模型 )。简而言之,当线程在单个内核上切换时,每个线程都会看到相同的读取和写入顺序。如果有不同的 cores/CPUs 和不同的现金,每个现金的读写顺序可能看起来不同。一旦算法依赖于内存访问顺序,使用它的程序可能会在 multi-core/multi-CPU 机器上出现故障,但在单核机器上永远不会失败。