c++ - 多线程和内存

标签 c++ multithreading cpu x86-64

我在 Visual C++ 文档中读到,多个线程从同一对象读取是安全的。

我的问题是:多核 X86-64 CPU 如何处理这个问题?

假设您有一个 1 MB 的内存块。不同的线程真的能够同时读取完全相同的数据,还是内核一次读取一个词而一次只允许一个内核读取一个特定的词?

最佳答案

如果您的 1MB block 中确实没有写入,那么是的,每个内核都可以毫无问题地从其自己的缓存行中读取,因为没有提交写入,因此不会出现缓存一致性问题。

在多核架构中,基本上每个内核都有一个缓存和一个“缓存一致性协议(protocol)”,它使某些没有最新信息的内核上的缓存无效。我认为大多数处理器都实现了 MOESI protocol用于缓存一致性。

缓存一致性是一个已被广泛讨论的复杂主题(我特别喜欢 Joe Duffy 的一些文章 herehere)。尽管如此,讨论还是围绕着代码可能的性能损失展开,虽然这些代码显然是无锁的,但由于缓存一致性协议(protocol)的启动以保持处理器缓存之间的一致性,可能会减慢速度,但是,只要没有写入,就根本没有保持一致性,因此不会损失性能。

澄清一下,如评论中所述,RAM 不能同时访问,因为 x86 和 x64 架构实现了一个总线,该总线在内核之间共享 SMP保证访问主存的公平性。尽管如此,这种情况被每个核心缓存所隐藏,每个核心缓存都允许每个核心拥有自己的数据拷贝。对于 1MB 的数据,在核心更新其缓存时可能会发生一些争用,但这可以忽略不计。

一些有用的链接:

关于c++ - 多线程和内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1666492/

相关文章:

c# - Func<T>.BeginInvoke 是否使用线程池?

qt - 诺基亚E63手机CPU瓶颈

cpu - 如何计算逻辑处理器的数量?

swift - 如果我使用的是 UIView.animate,我 Mac 的 CPU 负载高达 200%

c++ - 如何在 C++ 中将字符串中的字符转换为按字母顺序排列的前一个字符

java - 如何在Android应用程序中重复调用函数?

c++ - 添加小部件不起作用

java - 如何对我的顺序 Java 代码进行多线程处理

c++ - 使用稍后在 C++ 中定义的类类型定义类成员

c++ - eventFilter(QObject *obj, QEvent *e) 没有检测到正确的对象