x86 には、異なるアドレスへのロードとストアの両方をアトミックに行う命令があるとは思えません。(他のアーキテクチャについてはよくわかりませんが、そうしているアーキテクチャがあったとしても、非常に多くあるとは思えません。有用な価値はなく、高価になるでしょう。)
x86 (および x86_64) には、アトミックな read-modify-write 操作を実行できる命令が多数ありますが、単一のメモリ ロケーションに対してのみ実行できます。たとえば、BTS
テストアンドセットを行います。 XCHG
レジスタ内の値をメモリ内の値と交換します。 XADD
アトミックインクリメントを行います。 CMPXCHG
コンペアアンドスワップを行います。これらはいずれもデフォルトではアトミックではありませんがLOCK
、アセンブリ命令に接頭辞を追加することでアトミックにすることができます。
gnu__atomic_store(type *ptr, type *val, int memmodel)
は、あなたが思っていることをしません。http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.htmlを参照してください。val
それが行うことは、レジスタ(または何か(実際にはvalで何をするかは定義されていません))にロードし、値をアトミックに で指定されたメモリ位置に格納することptr
です。
x86 では、アラインされたロードとストア (値が 32 ビット以下の場合) はデフォルトでアトミックです。
ただし、必要がない限り、gnu ビルトインを使用しないでください。代わりに--std=c++11
フラグを使用してから、 C++atomics
を使用してください。