atomic_int test(void)
{
atomic_int tmp = ATOMIC_VAR_INIT(14);
tmp = 47; // Looks like atomic_store
atomic_int mc; // Probably just uninitialised data
memcpy(&mc,&tmp,sizeof(mc)); // Probably equivalent to a copy
tmp = mc + 4; // Arithmetic
return tmp; // A copy - perhaps load then store
}
クランは、このすべてに満足しています。私は標準のセクション7.17を読んで、それはメモリモデルと定義された関数(init、store、loadなど)についてたくさん述べていますが、通常の操作(+、=など)については何も言いません。
struct wot { atomic_int value; }
を関数に渡す動作も重要です。
私は、割り当てがatomic_loadと同じように動作し、memory_order_seq_cstを使用して格納すると思います。
さらに楽観的に、構造体の代入、関数への引き渡し、関数からの戻り、memcpyさえもmemory_order_seq_cstの下にビットパターンを慎重にコピーすることと同じように動作していると思います。
どちらの信念についても、私は支持証拠を見つけることができません。原子プリミティブの割り当てとmemcpyが未定義の動作である可能性は間違いありません。
原子プリミティブの基本的な操作はどのように動作しますか?
ありがとうございます!
ありがとうございます!通常のサイズと配置の制約が満たされている場合、memcpyは_Atomic型で定義されていますか?上記の例は、2つの_Atomic intの間のmemcpyであり、お互いに同じサイズになりますが、memcpyをアラインメントされたchar配列との間でやりとりすることは、私が_Atomic fields構造体内にあります。 –
いいえ、 '_Atomic'へのアクセスは、演算子または関数を通過する場合にのみ有効です。明らかに、もしあなたが 'memcpy'をやっているなら、原子性の保証はありません。 –
ありがとうございます。私はこれと一緒に働くことができると思う。 –