3

これは原子的に行うことができますか?

void load_and_store(int* dst, int* src) {
  int data = *src;
  *dst = data;
}

でアトミック ストアを実行する必要がある場合は、最初XCHG [addr], EAXにデータをロードする必要があります。EAX次に、ロードとストアはアトミックではありません。

gcc アトミック拡張void __atomic_store (type *ptr, type *val, int memmodel)には、ロードとストアの両方をアトミックに実行できるように見えるものがあります。

4

1 に答える 1

6

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を使用してください。

于 2013-05-16T01:09:50.357 に答える