アトミック操作用のテンプレート・クラス。
template<typename T> atomic;
#include "tbb/atomic.h"
atomic<T> は、アトミック read、write、fetch-and-add、fetch-and-store、compare-and-swap をサポートします。T は、整数型、列挙型またはポインター型です。T がポインター型の場合、算術演算はポインター算術として解釈されます。例えば、x に atomic<float*> 型が含まれ float が 4 バイトの場合、++x は 4 バイト単位で x を進めます。T が列挙型、void*、bool の場合、atomic<T> ではポインター算術は使用できません。
一部のメソッドでは、より選択的なメモリーフェンスが可能なテンプレート形式のメソッドのバリエーションが含まれます。IA-32 プロセッサーおよびインテル® 64 アーキテクチャー対応のプロセッサーでは、非テンプレート形式のバリエーションと同じ効果になります。IA-64 アーキテクチャーのプロセッサーでは、メモリー・サブシステムに読み取りと書き込みの順序についてより広い裁量権を与えることで、パフォーマンスを改善します。次の表は、非テンプレート形式の暗黙的な操作の順序を示しています。
|
種類 |
説明 |
デフォルト |
|---|---|---|
|
acquire (取得) |
アトミック操作の後の操作はアトミック操作を決して越えません。 |
read (読み取り) |
|
release (解放) |
アトミック操作の前の操作はアトミック操作を決して越えません。 |
write (書き込み) |
|
連続して一貫 |
アトミック操作の両側の操作はアトミック操作を決して越えません。連続して一貫したアトミック操作はグローバルな順序になります。 |
fetch_and_store, fetch_and_add, compare_and_swap |
atomic<T> クラスのコピー・コンストラクターはアトミックではありません。atomic<T> をアトミックにコピーするには、コピーをデフォルト宣言して、そのコピーに代入します。下記の例は、この違いを示しています。
atomic<T> y(x); // アトミックではない
atomic<T> z;
z=x; // アトミック代入
コピー・コンストラクターはコンパイラーが生成するためアトミックではありません。C++03 では、自明でないコンストラクターが含まれていると、名前空間スコープを動的に初期化する前に名前空間スコープ・インスタンスがゼロに初期化されるという、atomic<T> の重要なプロパティーが動作しなくなります。このプロパティーは、プログラムのスタートアップの初期に実行するコードでは不可欠です。
C++03 では、特定の値で atomic<T> を作成するには、デフォルト宣言してから、後で値を代入してください。C++11 では、constexpr の単一引数コンストラクターがあります。
namespace tbb {
enum memory_semantics {
acquire,
release
};
struct atomic<T> {
typedef T value_type;
// C++11 仕様:
atomic() = default;
constexpr atomic(T arg)
// C++11 仕様の最後
template<memory_semantics M>
value_type compare_and_swap( value_type new_value,
value_type comparand );
value_type compare_and_swap( value_type new_value,
value_type comparand );
template<memory_semantics M>
value_type fetch_and_store( value_type new_value );
value_type fetch_and_store( value_type new_value );
operator value_type() const;
value_type operator=( value_type new_value );
atomic<T>& operator=( const atomic<T>& value );
// T が整数型またはポインター型の場合のみ
// 次のメンバーが存在
template<memory_semantics M>
value_type fetch_and_add( value_type addend );
value_type fetch_and_add( value_type addend );
template<memory_semantics M>
value_type fetch_and_increment();
value_type fetch_and_increment();
template<memory_semantics M>
value_type fetch_and_decrement();
value_type fetch_and_decrement();
value_type operator+=(value_type);
value_type operator-=(value_type);
value_type operator++();
value_type operator++(int);
value_type operator--();
value_type operator--(int);
};
}
atomic<T*> を T へのポインターのように使用できるように、特殊な atomic<T*> も定義します。
T* operator->() const;
| メンバー | 説明 |
|---|---|
| memory_semantics Enum |
より選択的な操作の制御が可能なテンプレート・バリエーションの選択に使用する値を定義します。 |
| atomic() = default |
C++11 仕様。 コンパイラーにより生成されるデフォルト・コンストラクター。このコンストラクターは、ユーザー定義コンストラクターが何も宣言されていない場合と同じように動作します。 |
| constexpr atomic(value_type arg) |
C++11 仕様。 arg の値で *this を初期化します。引数が変換時定数の場合、初期化は変換時に行われます。その他の場合、初期化は実行時に行われます。 |
| value_type fetch_and_add( value_type addend ) |
x を *this の値にします。addend をアトミックに追加して x = x + addend にします。 戻り値: x のオリジナルの値。 |
| value_type fetch_and_increment() |
x を *this の値にします。アトミックにインクリメントして x = x + 1 にします。 戻り値: x のオリジナルの値。 |
| value_type fetch_and_decrement() |
x を *this の値にします。アトミックにデクリメントして x = x -1 にします。 戻り値: x のオリジナルの値。 |
| value_type
compare_and_swap
value_type compare_and_swap( value_type new_value, value_type comparand ) |
x を *this の値にします。comparand で x をアトミックに比較して、等しい場合は x=new_value に設定します。 戻り値: x のオリジナルの値。 |
| value_type fetch_and_store( value_type new_value ) |
x を *this の値にします。new_value で x の古い値をアトミックに交換します。 戻り値: x のオリジナルの値。 |