multithreading - 线程访问相同的缓存行

标签 multithreading caching operating-system

我遇到了一个关于线程不要访问相同缓存行的建议,我真的不明白为什么,而且在搜索该主题时,我遇到了以下问题:
Multiple threads and CPU cache
其中一个答案建议:

you just want to avoid two threads from simultaneously trying to access data that is located on the same cache line



在我看来,缓存存储内存页面以便从进程快速访问,正如这里所说:http://en.wikipedia.org/wiki/Thread_%28computing%29#How_threads_differ_from_processes

threads share their address space



两个线程访问相同的缓存行应该不成问题,因为如果页面在缓存中并且尝试访问内存的线程将获得缓存命中,而不管其他线程如何。

我听说过关于避免线程在几个不同的场合访问相同的缓存行的争论,所以这不是一个神话。我在这里缺少什么?

最佳答案

在大多数(可能是所有但我没有详尽的硬件知识)多核 CPU 中,当一个内核尝试写入相应的内存时,缓存将锁定当前访问的行。因此,尝试访问相同缓存行的其他内核将处于等待状态。

你可以在线程之间共享相同的数据,只要它是只读的(或不经常更新),但是如果你继续写入它,隐藏访问序列化将产生相当于在同一个核心上运行所有线程的性能(实际上有点糟糕,因为缓存锁定延迟)。

关于multithreading - 线程访问相同的缓存行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26675766/

相关文章:

python - object.__new__(thread.lock) 不安全,使用 thread.lock.__new__()

android - 更新用户的个人资料图片

caching - 如何禁用 Safari 13 中的所有缓存

c++ - 线程构建 block : Deadlocks because all threads used up

c++ - C++11 中的线程 ID 行为

java - 我已经编写了一个线程,但如何将其添加到我的 main 方法中?

c# - 典型的基于浏览器的 Web 解决方案可以利用缓存吗?

assembly - "org xxxx"在汇编中有什么用

operating-system - Windows 2000 上的 Java 7