注:书中对于不经意共享这里好像翻译错了
不经意共享(Incidental Sharing)与真共享(False Sharing)。不经意共享和真共享虽然都可能导致性能下降,但是它们的本质不同。在处理不经意共享时,需要考虑如何避免竞争问题,以提高程序的并发性;而在处理真共享时,则需要采取特殊措施来避免不必要的缓存行失效,以提高程序的性能。
设计并发的数据结构时,往往考虑一下3个问题:资源争夺,不经意共享)和数据紧凑程度。
要确定代码是否是不经意共享(诱发缓存乒乓)出的问题,我们可以使用这个结构体段进行代码性能的测试。
利用数据块进行填充相同的缓存块,使得缓存块中的数据与mutex不在同一块中,防止外部对mutex加锁时将数据连带载入缓存中,如果是读-改-写操作,则会使数据失效。
struct protected_data{
mutex n;
char block_padding[std::hardware_destructive_interference_size];
my_data data;
};
或者用下面这个也是可以的,进行的是后填充,使得数据在同一缓存块中。
struct my_data{
data_item d1;
data_item d2;
cahr block_padding[std::hardware_destructive_interference_size];
};
my_data arr[256];
std::hardware_constructive_interference_size:同一缓存块保证容纳的最大的连续字节数(前提是数据恰当的对齐)。硬件构造性干涉大小。两个并行内存访问间的最大距离。
std::hardware_destructive_interference_size:表示一个字节数的限度。硬件破坏性干涉大小。两个并行内存访问间 的最小距离