C++ atomic memory model和Arm实现方式

ZenonXiu(修志龙)

                                                                    MindShare思享                      3月14日

C++  atomic memory model  和 Arm构架实现

C++的memory model是软件工程师比较难理解的一部分,因为深入理解它需要有一定的CPU构架和微构架的知识基础。

C++作为高级语言本身应该和CPU的硬件是无关的,但是为了使一些原子(atomic)操作能够在CPU更有效率的运行,避免因为原子操作带来的memory ordering要求对系统性能的影响,C++的原子操作会带有memory ordering的限定。

本文将通过图表的方式介绍C++的atomic memory ordering和其在Arm构架上的实现。

阅读本文需要有些C++atomic和CPU构架基础。

C++ atomic 变量和操作

§std::atomic

 §The class to use when writing lock-free code! 

 §A template wrapper around various types, providing access that is: 

    Atomic – reads and writes are done as a whole. 

    Ordered with respect to other accesses to the variable (or others). 

§Depending on the target platform, operations can be lock-free, or protected by a mutex.

一个例子,

C++ memory model

§Memory access ordering is specified by std::memory_order _... 

 §Operations

can limit reordering around themselves for operations with the ordinary

variables and operations with other atomic variables.

下面是对每个memory

ordering specifier (std::memory_order _...)限定的memory

ordering的具体解释,绿色箭头表示允许的re-order,红色表示不允许的re-order. (图表原创,all copy rights

are reserved)

Armv8.1-A构架实现

在不同的Arm构架上,C++的atomic的实现会有所不同。

在v7-A上是通过LDREX/STREX + DMB来实现的,在V8-A上通过LDREX/STREX + DMB和Load-acquire (LDRA), store-release(STRL)指令来实现。

在Armv8.1-A上增加了atomic指令,这些指令本身也可以带acquire,release的memory ordering限定。

下面是Armv8.1-A的实现方法。

C++ lock free 编程

结语

只有充分理解C++的memory model,和理解它在具体CPU的实现,才能更正常和有效的使用它们。

本文作为一个概述,有时间再写更具体的内容。

你可能感兴趣的:(C++ atomic memory model和Arm实现方式)