1

标题可能看起来很奇怪,所以让我解释一下。经常有人讲授竞争条件,说线程 1 可以看到x == 0,而线程 2 已经看到了x=1;

我的问题是关于在同一个核心上调度的线程(并非不切实际,仍然有 1 个核心嵌入式系统,并且至少在理论上您可以将线程绑定到核心):
即使线程 1 和线程 2 按顺序运行,也会出现常见的竞争可见性问题(在同一个核心(X86,ARM)上一个之前/之后(与其他线程的c))...

4

1 回答 1

4

这仍然是一个问题。在单核上运行的线程一点也不现实。通常,您将运行数百个线程,但很可能您没有数百个内核。根据鸽子洞定理,这些线程中至少有两个共享一个核心。

竞争条件的出现是因为线程实际上不是连续的。确实它们轮流运行,但它们会被中断,并且 CPU 会意外地转移到另一个线程。想象一下这两个(假想的)汇编程序

       Thread 1                    Thread 2

A:  Read  R1, 0x0100        E:  Read  R2, 0x0100
B:  Inc   R1                F:  Dec   R2
C:  Store R1, 0x0100        G:  Store R2, 0x0100

如果您按顺序运行此代码,则没有问题。但是,如果您被允许打断他们,那么可能会发生这样的事情:

  • A 运行
  • B 运行
  • 线程 1 中断
  • E 运行
  • F 运行
  • G 运行
  • 线程 2 完成
  • C 运行

如果您跟踪寄存器和 address 处的值发生了什么0x0100,那么您将意识到最终值与顺序执行两段代码不同。

因此,您的问题的答案是,竞争发生在同一个 CPU 内核上的可抢占线程中,就像线程在不同的内核上运行一样。

于 2013-12-24T13:19:12.057 回答