并发的问题

注:书中对于不经意共享这里好像翻译错了

不经意共享(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:表示一个字节数的限度。硬件破坏性干涉大小。两个并行内存访问间 的最小距离

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值