c++ - 共享内存多线程和数据访问?

标签 c++ multithreading performance caching

关于性能,假设我们得到一个数据 block ,每个线程都会频繁访问这些数据,并且这些数据是只读的,这意味着线程除了读取数据之外不会做任何事情。

那么为每个线程创建一份这些数据的拷贝(假设那里的数据是只读的)是否有益?

如果所有线程共享频繁访问的数据(而不是每个线程一份),这不会增加这些数据被正确缓存的机会吗?

最佳答案

每个线程一份只读数据拷贝不会帮助您进行缓存;恰恰相反,当线程在同一个多核(并且可能是超线程)CPU 上执行并因此共享其缓存时,它可能会受到伤害,因为在这种情况下,数据的每个线程拷贝可能会竞争有限的缓存空间。

然而,在多 CPU 系统的情况下,现在几乎所有系统都是 NUMA,通常每个 CPU 内存组的访问成本在“本地”和“远程”内存之间略有不同,这可能是有益的有一个 per-CPU 只读数据拷贝,放置在其本地内存库中。

内存映射由操作系统控制,因此如果您走这条路,研究操作系统的 NUMA 相关行为是有意义的。例如,Linux采用first-touch内存分配策略,这意味着内存映射不发生在malloc,而是在程序第一次访问内存页时,OS尝试从本地分配物理内存银行。

通常的性能格言适用:衡量,不要猜测。

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

相关文章:

c - 寻找线程同步性能问题的解释

mysql - 优化 MySQL 查询,耗时将近 20 秒!

c++ - cpp中的cin对象

c++ - 内存中分配的 std::string 在哪里?

c - 多线程 - 只有在所有线程都完成任务后才继续

c++ - 通过引用传递对象到std::thread in C++11

javascript - Game of Life : Tried to increase computation efficiency with new algorithm, 反而减少了。为什么?

c++ - 看不懂const方法声明

c++ - 在 Mac OS 上使用 GCC 为 MS-DOS (DOSBox) 编译 C 程序

python - 如何在Python线程中使用qtwebkit?