multithreading - 比较和交换 - 如果 2 个处理器同时执行锁定会怎样?

标签 multithreading linux-kernel locking compare-and-swap

我在 https://en.wikipedia.org/wiki/Compare-and-swap 中读到了有关 CAS 的内容,并有一些疑问:

    1. 尽管单个锁定操作是在单个指令中实现的,但如果 2 个线程在 2 个不同的处理器上运行,则这 2 个指令可能会同时发生。这不是竞争条件吗?
  • 我在 <Linux Kernel Development> 3rd 中看到以下句子第168页。
  • because a process can execute on only one processor at a time

    我对此表示怀疑,不确定这是否是字面意思。如果进程有多个线程,它们不能同时在多个处理器上运行怎么办?

有人帮忙解释一下这些疑惑吗?谢谢。

最佳答案

CPU 有一个内存缓存,通常每个所谓的缓存行有 64 字节大小。它将针对该大小的 block 执行操作。特别是,在执行锁定 cmpxchg 或类似操作时,执行此操作的硬件线程将与其他线程协商对内存 64 字节部分的独占访问。这就是它起作用的原因。

一般来说,你想读这本书:https://www.kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html

第 21 页对此特定位进行了解释。

关于 LKD 的引言,没有提供任何上下文。可以安全地假设它们指的是线程并且正在更新线程本地计数器。

关于multithreading - 比较和交换 - 如果 2 个处理器同时执行锁定会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38930436/

相关文章:

python - 为什么将 list() 包裹在 map 周围会导致函数运行?

linux-kernel - 适用于 ARM 处理器的 Linux 内核 3.9 KVM

c - 在多线程程序中将全局数组锁定在需要重入的函数中?

c++ - 游戏中的多线程共享资源,需要一些关于想法的反馈

java - 静态成员的多线程行为

java - 在 Java 中什么是更快地传递参数或使用静态变量?

linux-kernel - 从内核空间中的 block 设备读取

linux - skbuff frags 和 frag_list 的区别

c++ - 使用 Windows C++ LockFIle() 锁定文件然后从中获取流?

c - 结束 gcc C Linux 中第一个成功的线程