2011-07-01 67 views
1

如果我有一个多处理器安装程序和两个访问相同内存的线程(假设同一个实际的字节或单词,不仅是“同一个区域”),是否会导致错误本身?对内存的并行读/写访问是否会导致错误/违规?

如果两个线程不仅是读取,而且写入和组合读写(例如,线程1尝试在线程2正在尝试写入的同时读取,或者如果两个线程都试图在同时)。这是否会导致错误/ BSOD/AV,或者是行为未定义的唯一问题? (根据实际的时间点,其中一个线程将得到错误的数据)

+1

您不会破坏您的计算机,因为物理上一次只会有一次内存操作;只是你不能预测这两个进程最终会读取什么,以及如果你不同步访问,内存位置的最终值是什么。 –

+0

我知道计算机不会中断;),但是有可能某个线程(或两者)会在出现这种情况时出错并退出? – Cray

+1

否。所有操作都照常执行,只是它们的结果是不可预测的。 –

回答

0

1)不,线程在程序应用程序内存中随处可读/写。 (好吧,可以保护一部分内存,如程序代码内存以保护它)。

2)任何CPU内核都有自己的缓存,并且数据首先被复制,然后在缓存行中被修改适当的(不可预知的)时间返回到RAM。有特殊的cpu指令(如锁)必须与其他指令(如cmpxchg)一起执行以确保原子(interlocked)RAM读取,写入或修改,某些指令默认为原子。请记住:原子(互锁)RAM访问的长度只能是1,2,4或8(以及64位CPU下的16)字节。 对于更长的存储器结构,您必须确保相应的锁定(sinhronisation)机制(如Critical Section),以避免多个线程对存储器进行不受控制的访问。