2016-07-04 6 views
1

例えば、代入はC11アトミックに何を意味しますか?

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が未定義の動作である可能性は間違いありません。

原子プリミティブの基本的な操作はどのように動作しますか?

ありがとうございます!

答えて

3

_Atomic修飾されたオブジェクト(およびatomic_intはそれとはまったく異なる文章です)での操作では、順次整合性が保証されます。それぞれのオペランドのセマンティクスセクションの最後に記述されています。

初期化ではATOMIC_VAR_INITマクロ(7.17.2.1)を使用する必要があります。memcpyは未定義です(サイズが一致しない可能性があります)。ただし、このコードは2つの場所で正しくありません。おそらくほとんどのアーキテクチャで動作します。

またライン

tmp = mc + 4;    // Arithmetic 

は、どのようなあなたのコメントの主張を行いません。これは、原子的オブジェクトに対する算術演算ではなく、通常の加算が続くロードです。より興味深いのは、順次整合性を有する原子操作である

mc += 4;    // Arithmetic 

です。

+0

ありがとうございます!通常のサイズと配置の制約が満たされている場合、memcpyは_Atomic型で定義されていますか?上記の例は、2つの_Atomic intの間のmemcpyであり、お互いに同じサイズになりますが、memcpyをアラインメントされたchar配列との間でやりとりすることは、私が_Atomic fields構造体内にあります。 –

+0

いいえ、 '_Atomic'へのアクセスは、演算子または関数を通過する場合にのみ有効です。明らかに、もしあなたが 'memcpy'をやっているなら、原子性の保証はありません。 –

+0

ありがとうございます。私はこれと一緒に働くことができると思う。 –

関連する問題