2017-10-04 14 views
0

ゴランの原子パッケージは、機能func LoadUint32(addr *uint32) (val uint32)を提供します。私はアセンブリの実装を調べました:基本的にメモリアドレスから値をロードして返します:Golang atomic.LoadUint32は必要ですか?

TEXT ·LoadUint32(SB),NOSPLIT,$0-12 
MOVQ addr+0(FP), AX 
MOVL 0(AX), AX 
MOVL AX, val+8(FP) 
RET 

私はuint32ポインタ(addr)xを持っているのですが、atomic.LoadUint32(x)を呼び出すことと、*xを使って直接アクセスすることの違いは何ですか?

+2

最初はアトミックであることが保証され、2番目はアトミックではありません。 – Volker

答えて

3

これは基本的にメモリアドレスから値をロードして返します。

あなたのコンテキストの場合であるが、atomicity異なるマシンアーキテクチャでは異なる可能性があることをdiscussed hereとして、実装されます。 go issue 8739

で述べたように
私たちは、アーキテクチャの束のためsync/atomicruntime/internal/atomicの両方をintrinsify。
APIは統一されていません(LoadUint32sync/atomicLoadruntime/internal/atomic)。

(* issue 4947のように "intrinsify")私の最初のリンクで述べたように

:ロードとストアについて

命令セットに伴うメモリモデルは、プレーンロードとストアがアトミックかどうかを指定します。すべての現代的な商品ハードウェアの典型的な保証は、整列した単語サイズの荷物と店舗は原子的であるということです。たとえば、x86アーキテクチャ(IA-32およびIntel 64)では、1,2,4,8および16バイトの整列されたロードおよびストアはすべてアトミックです(つまり、平文MOV命令、MOVQおよびMOVDQAはアトミックです) 。

+0

説明をいただきありがとうございます – user3746949

関連する問題