7

タイトルの通り、uint8の読み書きはアトミックですか?論理的には、8ビット変数の読み取りと書き込みを行うには、明らかに単一のCPU命令でなければなりません。しかし、いずれにせよ、2 つのコアが同時にメモリの読み取りと書き込みを行うことができますが、この方法で古いデータを作成することは可能ですか?

4

2 に答える 2

9

いいえ。アトミック操作が必要な場合は、sync/atomicパッケージを使用できます。

「Goメモリモデルを無視しても、8ビット操作はアトミックになりますか?」という意味であれば、答えはまだです。おそらくそうではないでしょう。

ハードウェアが読み取り/書き込み操作の原子性を保証する場合、それは原子性である可能性があります。しかし、それでもキャッシュの一貫性や並べ替え操作によるコンパイラの最適化は保証されません。Go が「atomic」パッケージで提供するプリミティブを使用し、「sync」パッケージとチャネルを使用して goroutine 間を調整して、何らかの方法で操作をシリアル化する必要があります。

于 2016-03-21T14:17:31.857 に答える
9

ネイティブ型へのアクセスがどのプラットフォームでもアトミックであるという保証はありません。これが存在する理由ですsync/atomicメモリ モデルのドキュメントのアドバイスも参照してください。

アトミックに値を設定する一般的な方法の例 ( Play )

var ax atomic.Value // may be globally accessible

x := uint8(5)

// set atomically
ax.Store(x)

x = ax.Load().(uint8)

uint8おそらく( Play )のより効率的なソリューション:

var ax int64 // may be globally accessible

x := uint8(5)

atomic.StoreInt64(&ax, 10)

x = uint8(atomic.LoadInt64(&ax))

fmt.Printf("%T %v\n", x, x)
于 2016-03-21T14:18:40.573 に答える