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

Posted MindShare思享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ atomic memory model和Arm实现方式相关的知识,希望对你有一定的参考价值。



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

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 memory model和Arm实现方式

C++ atomic 变量和操作

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


§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++ atomic memory model和Arm实现方式


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

C++ memory model

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

§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)


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



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



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


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

Armv8.1-A构架实现

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


在不同的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++ atomic memory model和Arm实现方式

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

C++ lock free 编程

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


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


结语

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

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


以上是关于C++ atomic memory model和Arm实现方式的主要内容,如果未能解决你的问题,请参考以下文章

带你整理面试过程中关于 Java 的内存模型 JMM(Java Memory Model)的相关知识

从 C++ 中的另一个线程读取指针

JMM(Java Memory Model) Java内存模型

[翻译] [The Go Memory Model](https://go.dev/ref/mem)

还是说Memory Model,gcc的__sync_synchronize真是太坑爹了

为啥在已经使用 seq_cst CAS 的无锁队列中需要 atomic_thread_fence(memory_order_seq_cst)?