4

たとえば、アトミック変数がある場合、

std::atomic<int> x;

読み取りと書き込みを実行したい場合は、「通常の」構文を使用できます。たとえば、

std::cout << x;       // read from x
x = 5;                // write to x

明示的関数loadstoreメンバー関数も使用できます。

std::cout << x.load();       // read from x
x.store(5);                  // write to x

Andrei Alexandrescu や Anthony Williams のような人々が明示的な形式loadstore形式のみを使用することを推奨しているのを見てきました。おそらく、「通常の」形式では変数がアトミックであることを強調していないためです。これは、ハンガリーの記譜法の一種のように思えます。アトミックを読み書きするときに使用する構文に関する新しい規則はありますか?

4

1 に答える 1

10

「考えたことを実行する」ために、いくつかの操作がオーバーロードされます。これは、連続した一貫したメモリ順序で実行されます。そう:

  • int n = x;と同じint n = x.load(std::memory_order_seq_cst)であり、
  • x = 1と同じx.store(1, std::memory_order_seq_cst)です。

ただし、何らかの種類の緩和されたメモリ順序付けが必要な場合は、明示的なメンバー関数を使用する必要がありますint n = x.load(std::memory_order_acquire)

「自然な」見た目のコードは一般的に正しい (「データ競合のないプログラムに対して順次一貫性がある」実行モデルを思い出してください) という考えですが、よりリスクが高く、より積極的な操作が利用可能です。それらは明示的でなければなりません。

于 2014-05-17T00:10:27.100 に答える