Multithreading 多个CPU上的多个进程读取和写入相同的数据

Multithreading 多个CPU上的多个进程读取和写入相同的数据,multithreading,concurrency,synchronization,cpu,processors,Multithreading,Concurrency,Synchronization,Cpu,Processors,我现在正在研究并发性,我有一些疑问 让我们以wiki为例。 简单的非原子方式读取值,加1,然后写回。 如果两个进程同时运行,则这些步骤可能会相互交错。 例如,第一个进程读取并添加1,但它被挂起。第二个进程读取、添加1并写回,然后被中断。第一个进程继续并写回一个旧值 我理解原子比较和交换是如何解决这个问题的。它读取、添加1,并使用比较和交换进行写入,如果比较和交换失败,则重试 然而,我在想象一个场景,我们有多个核心执行多个线程。如果第一个进程和第二个进程在不同的内核上同时运行会怎样?i、 e.C

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

让我们以wiki为例。

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

我理解原子比较和交换是如何解决这个问题的。它读取、添加1,并使用比较和交换进行写入,如果比较和交换失败,则重试

然而,我在想象一个场景,我们有多个核心执行多个线程。如果第一个进程和第二个进程在不同的内核上同时运行会怎样?i、 e.CPU1上的进程1进行读取、添加、比较和交换的同时,CPU2上的进程2进行读取、添加、比较和交换。我认为比较和交换也会成功


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

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

例如,在Intel上,原子比较和交换由锁CMPXCHG实现。锁定前缀可确保:

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


(,第2A卷第3-462页)。

谢谢你的回答。这是一个合理的硬件解决方案。