私のアプリケーションでは、intおよびbool変数があり、これらは複数のスレッドによってアクセスされます(複数の書き込み/読み取り)。現在、私は2つのミューテックスを使用しています。1つはint用で、もう1つはbool用で、これらの変数を保護しています。
アトミック変数と演算子を使用してロックフリーのマルチスレッドプログラムを作成することについて聞いたことがあります。私の質問は
これらのコードはスレッドセーフですか?
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;
私はエキスパートでも何でもありませんが、ここに私が知っていることがあります:
std::atomic
は、load
とstore
(およびその他のいくつかの操作)を同時に呼び出すことが明確に定義されていることを示しています。アトミック操作は不可分です-「中間」では何も起こりません。std::atomic
はboost::atomic
に基づいていると思います。可能であればstd
を使用します。それ以外の場合はboost
を使用します。std
は完全にそうですが、コンパイラはC++ 11をサポートする必要がありますstd::atomic_bool
。 volatileを使用する必要はありません。また、load
/store
はoperator=
/operator T
とは異なると思います 。load
/store
のみがアトミックです
気にしないで。標準を確認しましたが、演算子はload
/store
/etcで定義されているようですが、返される値が異なる場合があります。
参考文献:
揮発性は、アトミックの実装に使用するものと直交しています。 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 から)
std::atomic
はC++ 11以降の標準であり、Boostのものは古いです。しかし、現在は標準なので、std::atomic
を使用します。std::atomic
を使用できます。追加情報なし...
std :: atomic;
std::atomic
(C++ 11)とboost.atomic
は同等だと思います。 std::atomic
がコンパイラでまだサポートされていない場合は、boost::atomic
を使用してください。