gpt4 book ai didi

c++ - 如果只有一个 CPU 内核,每个线程是否也存在内存可见性问题?

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:11 27 4
gpt4 key购买 nike

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

我的问题是关于在同一个核心上安排的线程(并非不切实际,仍然有 1 个核心嵌入式系统和 afaik 你至少在理论上可以将线程绑定(bind)到核心):
即使线程 1 和线程 2 在同一核心(X86、ARM)上顺序运行(一个在另一个之前/之后(与其他线程)),是否也会发生通常的竞争可见性问题...

最佳答案

还是有问题。线程跑在单核上一点都不现实。通常,您会运行数百个线程,但很可能没有数百个内核。根据鸽巢定理,这些线程中至少有两个共享一个核心。

竞争条件的出现是因为线程实际上不是顺序的。确实他们轮流运行,但是他们被打断了,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 运行

如果跟踪寄存器和地址 0x0100 处的值发生了什么,那么您会发现最终值与顺序执行这两段代码不同。

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

关于c++ - 如果只有一个 CPU 内核,每个线程是否也存在内存可见性问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20761506/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com