如果两个不同的内核试图同时写入主存中的同一个位置,会发生什么?主内存是否自动只允许一次写入一个内存点,还是必须发生某种昂贵的锁定?
(基本上我想知道写入原子 volatile int 的成本是多少,以及它是否会影响其他无法访问它的进程和线程,例如,如果总线被锁定,它会影响一切,对吧?)
如果两个不同的内核试图同时写入主存中的同一个位置,会发生什么?主内存是否自动只允许一次写入一个内存点,还是必须发生某种昂贵的锁定?
(基本上我想知道写入原子 volatile int 的成本是多少,以及它是否会影响其他无法访问它的进程和线程,例如,如果总线被锁定,它会影响一切,对吧?)
每个多核 CPU 都有一种方法来确保每个核的写入按照先到先得的原则进行排序。如果不是这样,您就会遇到两个内核都试图同时驱动内存总线的情况,这将导致冒烟。
所以是的,锁定确实发生在电子级别,但它并不昂贵。虽然它相对复杂,因为内存反映在缓存中,因此称为总线侦听的机制允许缓存在另一个内核或外围设备更改其当前正在缓存的内存位置的内容时发现。
因此,如果没有其他进程或核心使用相同的内存位置,那么它们的缓存将不会缓存它,因此您的读写将不受阻碍地进行。最初,写入将仅用于缓存,并且仅当正在运行的进程在其他地方访问足够的内存以迫使缓存刷新时,才会将其写入主内存。
硬件与内存只有一个物理连接。它不能同时被两个不同的来源写入。不过,它似乎会发生。
如果您尝试从两个进程/线程进行读取然后写入,那么如果它们重叠可能会导致这种情况。使用原子操作的“互斥锁”实现了一种绕过它的方法。