我在Visual C文档中读到,多个线程从同一个对象读取是安全的.
我的问题是:具有多个内核的X86-64 cpu如何处理这个问题?
假设您有1 MB的内存块.不同的线程是否能够同时读取完全相同的数据,或者核心是否一次读取一个字,只允许一个核心一次读取一个特定的字?
解决方法
不仅允许不同的内核从同一块内存中读取,它们也可以同时写入.如果它是“安全的”,那是一个完全不同的故事.你需要在你的代码中实现某种防护(通常用信号量或它们的衍生物来完成),以防止多个内核以你没有特别允许的方式在同一块内存上进行战斗.
关于核心一次读取的内存大小,通常是寄存器的值,32位cpu为32位,64位cpu为64位,依此类推.甚至流式传输也是通过dword完成的(例如,查看memcpy).
关于如何并发多个核心,每个核心使用单个总线来读取和写入内存,因此访问任何资源(ram,外部设备,浮点处理单元)一次只能一个请求,一次一个核心.然而,核心内部的实际处理是完全并发的. DMA传输也不会阻塞总线,并发传输一次排队并处理一个(我相信,不是100%肯定).
编辑:只是为了澄清,不像这里的其他回复,我只谈论一个无缓存的情况.当然,如果内存被缓存,则只读访问是完全并发的.