0

我现在正在研究并发,我有一些疑问。

让我们以wiki上的例子为例。 http://en.wikipedia.org/wiki/Atomic_(computer_science)

天真的、非原子方式读取一个值,加 1,然后写回。如果 2 个进程同时运行,则这些步骤可能会相互交错。例如,第一个进程读取并添加 1,但它被挂起。第二个进程读取,加 1 并写回并被中断。第一个进程恢复并写回旧值。

我了解原子比较和交换如何解决问题。它读取,加 1,并使用比较和交换来写入,如果比较和交换失败,则重试。

但是,我正在想象一个场景,我们有多个内核执行多个线程。如果第一个进程和第二个进程在不同的内核上同时运行会怎样?即 CPU1 上的 Process1 在 CPU2 上的 Process2 读取、添加、比较和交换的同时进行读取、添加、比较和交换。我认为比较和交换也会成功。

这种情况甚至可能吗?如果是这样,它是如何处理的?

4

1 回答 1

1

比较和交换是在硬件中实现的;粗略地说,处理器与内存总线一起工作,以确保执行比较和交换的内核具有对共享内存的独占访问权限。所以这两个进程实际上不可能同时运行:一个将是第一个获得共享内存的(硬件保证的)锁。

例如,在 Intel 上,原子比较和交换是由 LOCK CMPXCHG 实现的。LOCK 前缀确保:

在多处理器环境中,LOCK# 信号确保处理器在信号被断言时独占使用任何共享内存。

英特尔® 64 和 IA-32 架构软件开发人员手册第 2 卷(2A、2B 和 2C):指令集参考,AZ,第 2A 卷,第 3-462 页)。

于 2014-03-12T18:05:20.910 回答