一、引言
在多线程编程和共享内存系统中,为了提高程序性能,常常需要对共享数据进行处理。然而,在并发环境下,一种名为“伪共享(False Sharing)”的问题可能会悄然出现,它虽然不像传统的多线程同步问题(如数据竞争)那样广为人知,但却会对程序的性能产生严重的负面影响。因此,深入理解伪共享的概念、危害以及定位和解决方法,对于编写高效的并发程序至关重要。
二、什么是伪共享
伪共享是指多个线程同时修改位于同一缓存行(Cache Line)的不同变量时,由于缓存一致性协议的影响,导致缓存行在不同核心之间频繁无效化和重新加载,从而引起性能下降的现象。
为了更好地理解伪共享,需要先了解缓存行的概念。现代计算机处理器通常会将主存中的数据分成固定大小的块(一般为 64 字节)加载到高速缓存(Cache)中,这个固定大小的块就是缓存行。缓存一致性协议(如 MESI 协议)用于保证多个核心之间的缓存数据一致性。当一个核心修改了某个缓存行中的数据时,其他核心中缓存该行数据的副本会被标记为无效。
假设有两个独立的变量 a
和 b
,分别被两个不同的线程频繁修改。如果它们在内存中的存储位置相邻,并且恰好处于同一个缓存行中,那么当一个线程修改 a
时,会将所在的缓存行标记为无效。此时,另一个核心中缓存该缓存行副本的线程,尽管只对 b
进行操作,但由于缓存行无效,也需要从主存中重新加载该缓存行,这就产生了额外的开销,导致伪共享问题。