C++11内存模型详解

    C++内存模型可以被看作是C++程序和计算机系统(包括编译器,多核CPU等可能对程序进行乱序优化的软硬件)之间的契约,它规定了多个线程访问同一个内存地址时的语义,以及某个线程对内存地址的更新何时能被其它线程看见.

关于乱序

   首先需要明确一个普遍存在,但却未必人人都注意到的事实:程序并不总是按照源码中的顺序被执行的,此谓之乱序,乱序产生的原因可能有好几种:

1. 编译器出于优化的目的,在编译阶段将源码的顺序进行交换。
2. 程序执行期间,指令流水被CPU乱序执行。
3. Cache的分层及刷新策略使得有时候某些写,读操作的顺序被重排。

   以上乱序现象虽然来源不同,但从源码的角度,对上层应用程序来说,他们的效果其实相同:写出来的代码与最后被执行的代码是不一致的。

   这个事实可能会让人很惊讶:有这样严重的问题,还怎么写得出正确的代码?这担忧是多虑了,乱序的现象虽然普遍存在,但它们都有很重要的一个共同点:在单线程执行的情况下,乱序执行与不乱序执行,最后都会得出相同的结果 (both end up with the same observable result), 这是乱序被允许出现所需要遵循的首要原则,也是为什么乱序虽然一直存在但却大部分程序员都感觉不到的原因。乱序的出现说到底是编译器,CPU 等为了让你程序跑得更快而作出无限努力的结果,程序员们应该为它们的良苦用心抹一把泪。

   从乱序的种类来看,乱序主要可以分为如下4种:

// 写写乱序(store store), 前面的写操作被放到了后面的操作之后,比如:
a = 3;
b = 4;
// 被乱序为
b = 4;
a = 3;

// 写读乱序(store load),前面的写操作被放到了后面的读操作之后,比如:
a = 3;
load
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值