web-dev-qa-db-ja.com

C ++ std :: atomicとBoost atomic

私のアプリケーションでは、intおよびbool変数があり、これらは複数のスレッドによってアクセスされます(複数の書き込み/読み取り)。現在、私は2つのミューテックスを使用しています。1つはint用で、もう1つはbool用で、これらの変数を保護しています。

アトミック変数と演算子を使用してロックフリーのマルチスレッドプログラムを作成することについて聞いたことがあります。私の質問は

  1. アトミック変数と演算子の定義は何ですか?
  2. std :: atomicboost/atomic.hppの主な違いは何ですか?どちらがより標準的または人気がありますか?
  3. これらのライブラリはプラットフォームに依存していますか?現在Linuxでgnu gcc 4.6を使用していますが、理想的にはクロスプラットフォームである必要があります。 「アトミック」の定義は実際にはハードウェアにも依存すると聞いた。誰かもそれを説明できますか?
  4. 複数のスレッド間でブール変数を共有する最良の方法は何ですか? "volatile"キーワードを使用したくない。

これらのコードはスレッドセーフですか?

double double_m; // double_m is only accessed by current thread.
std::atomic<bool> atomic_bool_x;
atomic_bool_x = true && (double_m > 12.5);

int int_n; // int_n is only accessed by current thread.
std::atomic<int> atomic_int_x;
std::atomic<int> atomic_int_y;
atomic_int_y = atomic_int_x * int_n;
28
2607

私はエキスパートでも何でもありませんが、ここに私が知っていることがあります:

  1. std::atomicは、loadstore(およびその他のいくつかの操作)を同時に呼び出すことが明確に定義されていることを示しています。アトミック操作は不可分です-「中間」では何も起こりません。
  2. std::atomicboost::atomicに基づいていると思います。可能であればstdを使用します。それ以外の場合はboostを使用します。
  3. どちらも移植可能で、stdは完全にそうですが、コンパイラはC++ 11をサポートする必要があります
  4. 可能性が高いstd::atomic_bool。 volatileを使用する必要はありません。

また、load/storeoperator=/operator Tとは異なると思います load/storeのみがアトミックです

気にしないで。標準を確認しましたが、演算子はload/store/etcで定義されているようですが、返される値が異なる場合があります。

参考文献:

17
Pubby

揮発性は、アトミックの実装に使用するものと直交しています。 C++では、その変数を使用して最適化を実行することが安全ではないことをコンパイラに通知します。ハーブ・サッターズがそれを説明します:

ロックを使用せずにスレッド間で通信するロックフリーコードを安全に作成するには、順序付けされたアトミック変数(Java/.NET揮発性、C++ 0xアトミック、およびC互換アトミック_T)を使用することをお勧めします。

特殊なハードウェアまたは他の異常なセマンティクスを持つメモリと安全に通信するには、最適化できない変数(ISO C/C++ volatile)を使用します。ただし、これらの変数の読み取りと書き込みは必ずしもアトミックではないことに注意してください。

最後に、異常なセマンティクスを持ち、ロックフリーコーディングに必要な原子性または順序付けの保証のいずれかまたはすべてを備えた変数を表現するために、ISO C++ 0xドラフト標準のみが直接スペルを記述する方法を提供しています:volatile atomic 。

(from http://drdobbs.com/article/print?articleId=212701484&siteSectionName=parallel から)

7
  1. std :: atomic class templateを参照してください
  2. std::atomicはC++ 11以降の標準であり、Boostのものは古いです。しかし、現在は標準なので、std::atomicを使用します。
  3. ??必要な各プラットフォームの各C++ 11コンパイラでstd::atomicを使用できます。
  4. 追加情報なし...

    std :: atomic;

2
cooky451

std::atomic(C++ 11)とboost.atomicは同等だと思います。 std::atomicがコンパイラでまだサポートされていない場合は、boost::atomicを使用してください。

1
01100110