gpt4 book ai didi

c++ - 多线程和内存

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:16 30 4
gpt4 key购买 nike

我在 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com