关于性能,假设我们得到一个数据 block ,每个线程都会频繁访问这些数据,并且这些数据是只读的,这意味着线程除了读取数据之外不会做任何事情。
那么为每个线程创建一份这些数据的拷贝(假设那里的数据是只读的)是否有益?
如果所有线程共享频繁访问的数据(而不是每个线程一份),这不会增加这些数据被正确缓存的机会吗?
最佳答案
每个线程一份只读数据拷贝不会帮助您进行缓存;恰恰相反,当线程在同一个多核(并且可能是超线程)CPU 上执行并因此共享其缓存时,它可能会受到伤害,因为在这种情况下,数据的每个线程拷贝可能会竞争有限的缓存空间。
然而,在多 CPU 系统的情况下,现在几乎所有系统都是 NUMA,通常每个 CPU 内存组的访问成本在“本地”和“远程”内存之间略有不同,这可能是有益的有一个 per-CPU 只读数据拷贝,放置在其本地内存库中。
内存映射由操作系统控制,因此如果您走这条路,研究操作系统的 NUMA 相关行为是有意义的。例如,Linux采用first-touch内存分配策略,这意味着内存映射不发生在malloc
,而是在程序第一次访问内存页时,OS尝试从本地分配物理内存银行。
通常的性能格言适用:衡量,不要猜测。
关于c++ - 共享内存多线程和数据访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13450474/