开发者社区> 问答> 正文

内存屏障让缓存行失效,只是无法读吗?:报错

volatile关键字底层是通过加内存屏障来完成的,但是无法保证线程安全, 这样如果有一个变量i = 0用volatile修饰,两个线程对其进行i++操作,如果线程1从内存中读取i=0进了缓存,然后把数据读入寄存器,之后时间片用完了,然后线程2也从内存中读取i进缓存,因为线程1还未执行写操作,内存屏障是插入在写操作之后的指令,意味着还未触发这个指令,所以缓存行是不会失效的。然后线程2执行完毕,内存中i=1,然后线程1又开始执行,然后将数据写回缓存再写回内存,结果还是1。

但是线程2触发内存屏障后,使得线程1对应的cpu缓存失效了(假设再次获取时间片后还是在同一个cpu),还能再次写回缓存吗???

展开
收起
kun坤 2020-06-07 20:36:13 458 0
1 条回答
写回答
取消 提交回答
  • 这种竞争条件要考虑所有可能的顺序组合,再加上内存屏障的功能综合起来考虑。

    建议你先把所有可能的两个线程的执行顺序列出来,包括内存屏障指令。再每个都分析一遍,这样结果就很清晰了

    ######回复 @0o涛涛o0 : 你还没列呢######然而并没有
    2020-06-07 20:36:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
基于英特尔 SSD 的虚拟机缓存解决SSD 立即下载
用户态高速块缓存方案 立即下载
高性能Web架构之缓存体系 立即下载