标题可能看起来很奇怪,所以让我解释一下。
教授种族条件的人通常会说线程1可以看到x == 0
而线程2已经x=1;
我的问题是关于在同一核心上安排的线程(不是不切实际的,仍然有1个核心嵌入式系统,并且至少在理论上你可以将线程绑定到核心):
即使thread1和thread2在同一个核心(X86,ARM)上顺序运行(一个/另一个(使用其他线程)),也会发生通常的竞争可见性问题......
答案 0 :(得分: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
如果顺序运行此代码,则没有问题。但是,如果你被允许打断它们,那么可能会发生这样的事情:
如果您跟踪寄存器的内容和地址0x0100
的值,那么您将意识到结束值与顺序执行两段代码不同。
所以问题的答案是,竞争发生在同一CPU内核上的 preemptable 线程中,就像线程在不同的内核上运行一样。