作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 Visual C++ 文档中读到,多个线程从同一对象读取是安全的。
我的问题是:多核 X86-64 CPU 如何处理这个问题?
假设您有一个 1 MB 的内存块。不同的线程真的能够同时读取完全相同的数据,还是内核一次读取一个词而一次只允许一个内核读取一个特定的词?
最佳答案
如果您的 1MB block 中确实没有写入,那么是的,每个内核都可以毫无问题地从其自己的缓存行中读取,因为没有提交写入,因此不会出现缓存一致性问题。
在多核架构中,基本上每个内核都有一个缓存和一个“缓存一致性协议(protocol)”,它使某些没有最新信息的内核上的缓存无效。我认为大多数处理器都实现了 MOESI protocol用于缓存一致性。
缓存一致性是一个已被广泛讨论的复杂主题(我特别喜欢 Joe Duffy 的一些文章 here 和 here)。尽管如此,讨论还是围绕着代码可能的性能损失展开,虽然这些代码显然是无锁的,但由于缓存一致性协议(protocol)的启动以保持处理器缓存之间的一致性,可能会减慢速度,但是,只要没有写入,就根本没有保持一致性,因此不会损失性能。
澄清一下,如评论中所述,RAM 不能同时访问,因为 x86 和 x64 架构实现了一个总线,该总线在内核之间共享 SMP保证访问主存的公平性。尽管如此,这种情况被每个核心缓存所隐藏,每个核心缓存都允许每个核心拥有自己的数据拷贝。对于 1MB 的数据,在核心更新其缓存时可能会发生一些争用,但这可以忽略不计。
一些有用的链接:
关于c++ - 多线程和内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1666492/
我是一名优秀的程序员,十分优秀!