C++ Concurrency in Action (by Anthony Williams)

【P.S.】把这本书最重要的章节总结如下。

在C++0x中,原子操作的内存时序模型(Memory Ordering for Atomic Operation in C++0x)

C++0x提供了三种内存时序模型,用来定义原子操作在同一线程里的关系、不同线程之间的同步:

  • 顺序一致型的时序(Sequentially Consistent Ordering)
  • 松弛型的时序(Relaxed Ordering)
  • “获取-释放”型的时序(acquire-release、consume-release)

顺序一致型的时序,是默认的。如果所有的原子变量都使用“顺序一致的时序”,那么它们执行的先后顺序将如同在单线程里一样明确而且唯一,所有的线程看到的原子变量读写顺序都是一样的。这个明确且唯一的执行顺序被称为这些原子变量的“Single Total Ordering”。Single意为“唯一”;Total意为“针对所有的线程”。因为有了这么严格的限制,所以没有冲突,没有不一致。这个时序模型相对于其它的模型,其缺点是,线程间的同步将消耗很多CPU的性能。

松弛型的时序,正好相反。不同的线程之间没有同步,所以,某个线程中的一个原子变量的读写,在其它的线程那里看来,或许是完全不一样的顺序。它只保证,在同一线程里的原子变量的读写操作,不会被编译器改动。它们在执行时的先后顺序,严格按照你(程序员)的代码来进行。编译器在优化时不会移动它们。这种限制是最基础的,其它时序类型的原子操作,也都提供了这种保证。

“获取-释放”型的时序,介于上面二者之间,是一种折中方案。它进行有针对性的限制,既能达到同步的目的,又不会过多损耗CPU。

注意,不同的CPU架构,在实现上面的这些时序时,花费的代价是不同的。“弱时序型”的CPU架构,提供了更多更精细的指令,用于实现线程之间的同步,花的时间自然就更多。x86、x86-64(Intel、AMD)是强时序型的CPU架构,相对而言,在实现acquire-release、sequentially consistent时序方面,只花了很小的代价。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值