ZenonXiu(修志龍)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? MindShare思享? ? ? ? ? ? ? ? ? ? ? 3月14日
C++ ?atomic memory model ?和 Arm構(gòu)架實(shí)現(xiàn)
C++的memory model是軟件工程師比較難理解的一部分蛉腌,因?yàn)樯钊肜斫馑枰幸欢ǖ腃PU構(gòu)架和微構(gòu)架的知識(shí)基礎(chǔ)怯疤。
C++作為高級(jí)語(yǔ)言本身應(yīng)該和CPU的硬件是無(wú)關(guān)的斤富,但是為了使一些原子(atomic)操作能夠在CPU更有效率的運(yùn)行仪搔,避免因?yàn)樵硬僮鲙?lái)的memory ordering要求對(duì)系統(tǒng)性能的影響,C++的原子操作會(huì)帶有memory ordering的限定。
本文將通過圖表的方式介紹C++的atomic memory ordering和其在Arm構(gòu)架上的實(shí)現(xiàn)。
閱讀本文需要有些C++atomic和CPU構(gòu)架基礎(chǔ)。
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.
一個(gè)例子鹃操,
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.
下面是對(duì)每個(gè)memory
ordering specifier (std::memory_order _...)限定的memory
ordering的具體解釋,綠色箭頭表示允許的re-order,紅色表示不允許的re-order. (圖表原創(chuàng)春哨,all copy rights
are reserved)
Armv8.1-A構(gòu)架實(shí)現(xiàn)
在不同的Arm構(gòu)架上荆隘,C++的atomic的實(shí)現(xiàn)會(huì)有所不同。
在v7-A上是通過LDREX/STREX + DMB來(lái)實(shí)現(xiàn)的赴背,在V8-A上通過LDREX/STREX + DMB和Load-acquire (LDRA), store-release(STRL)指令來(lái)實(shí)現(xiàn)椰拒。
在Armv8.1-A上增加了atomic指令,這些指令本身也可以帶acquire,release的memory ordering限定凰荚。
下面是Armv8.1-A的實(shí)現(xiàn)方法燃观。
C++ lock free 編程
結(jié)語(yǔ)
只有充分理解C++的memory model,和理解它在具體CPU的實(shí)現(xiàn)便瑟,才能更正常和有效的使用它們缆毁。
本文作為一個(gè)概述,有時(shí)間再寫更具體的內(nèi)容到涂。