我现在正在研究并发性,我有些疑惑。
让我们以wiki为例。 http://en.wikipedia.org/wiki/Atomic_(computer_science)
天真的非原子方式读取一个值,加1,然后回写。 如果2个进程同时运行,则这些步骤可以相互交错。 例如,第一个进程读取并添加1,但它会被暂停。第二个进程读取,添加1并写回并被中断。第一个进程恢复并回写旧值。
我理解原子比较和交换如何解决问题。它读取,添加1,并使用比较和交换进行写入,并在比较和交换失败时重试。
但是,我想象的是我们有多个核心执行多个线程的情况。如果第一个流程和第二个流程在不同核心上完全同时运行怎么办?即CPU1上的Process1在CPU2上的Process2读取,添加,比较和交换的同时读取,添加,比较和交换。我认为比较和交换也会成功。
这种情况甚至可能吗?如果是这样,它是如何处理的?
答案 0 :(得分:1)
比较和交换在硬件中实现;粗略地说,处理器与内存总线一起工作,以确保执行比较和交换的内核具有对共享内存的独占访问权限。因此,两个进程实际上不可能同时运行:一个将是第一个获得共享内存的(硬件保证)锁定。
例如,在英特尔上,原子比较和交换由LOCK CMPXCHG实现。 LOCK前缀确保:
在多处理器环境中,LOCK#信号确保处理器在声明信号时独占使用任何共享内存。
(Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2 (2A, 2B & 2C): Instruction Set Reference, A-Z,vol 2A p.3-462)。