enumerable_thread_specific
[tls.enumerable_thread_specific]
スレッド・ローカル・ストレージ (TLS) のクラス・テンプレート。
// <oneapi/tbb/enumerable_thread_specific.h> ヘッダーで定義
namespace oneapi {
namespace tbb {
enum ets_key_usage_type { ets_key_per_instance, ets_no_key, ets_suspend_aware };
template <typename T, typename Allocator=cache_aligned_allocator<T>, ets_key_usage_type ETS_key_type=ets_no_key >
class enumerable_thread_specific {
public: // Basic types
using value_type = T;
using reference = T&;
using const_reference = const T&;
using pointer = T*;
using size_type = /* implementation-defined */;
using difference_type = /* implementation-defined */;
using allocator_type = Allocator;
// Iterator types
using iterator = /* implementation-defined */;
using const_iterator = /* implementation-defined */;
// Parallel range types
using range_type = /* implementation-defined */;
using const_range_type = /* implementation-defined */;
// Construction
enumerable_thread_specific();
template <typename Finit> explicit enumerable_thread_specific( Finit finit );
explicit enumerable_thread_specific( const T& exemplar );
explicit enumerable_thread_specific( T&& exemplar );
template <typename...Args> enumerable_thread_specific( Args&&... args );
// Destruction
~enumerable_thread_specific();
// Copy constructors enumerable_thread_specific( const enumerable_thread_specific& other);
template<typename Alloc, ets_key_usage_type Cachetype>
enumerable_thread_specific( const enumerable_thread_specific<T, Alloc, Cachetype>& other);
// Copy assignments
enumerable_thread_specific& operator=( const enumerable_thread_specific& other );
template<typename Alloc, ets_key_usage_type Cachetype>
enumerable_thread_specific& operator=( const enumerable_thread_specific<T, Alloc, Cachetype>& other );
// Move constructors
enumerable_thread_specific( enumerable_thread_specific&& other);
template<typename Alloc, ets_key_usage_type Cachetype>
enumerable_thread_specific( enumerable_thread_specific<T, Alloc, Cachetype>&& other);
// Move assignments
enumerable_thread_specific& operator=( enumerable_thread_specific&& other );
template<typename Alloc, ets_key_usage_type Cachetype>
enumerable_thread_specific& operator=( enumerable_thread_specific<T, Alloc, Cachetype>&& other );
// Other whole container operations
void clear();
// Concurrent operations
reference local();
reference local( bool& exists );
size_type size() const;
bool empty() const;
// Combining
template<typename BinaryFunc> T combine( BinaryFunc f );
template<typename UnaryFunc> void combine_each( UnaryFunc f );
// Parallel iteration
range_type range( size_t grainsize=1 );
const_range_type range( size_t grainsize=1 ) const;
// Iterators
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
};
} // namespace tbb
} // namespace oneapi
クラス・テンプレート enumerable_thread_specific
は、T
タイプの要素に TLS を提供します。クラス・テンプレート enumerable_thread_specific
は、すべてのスレッドローカル要素でイテレーターと範囲を提供することで、コンテナーとして機能します。
スレッドローカル要素は遅延作成されます。新しく作成された enumerable_thread_specific
には、要素は含まれていません。スレッドが、enumerable_thread_specific
へのアクセスを要求すると、そのスレッドに対応する要素が作成されます。要素の数は、enumerable_thread_specific
にアクセスした個別のスレッド数に等しく、アプリケーションが使用するスレッド数とは必ずしも一致しません。enumerable_thread_specific
をクリアすると、その全ての要素が削除されます。
ETS_key_usage_type
パラメーター・タイプを使用して、ベースになる実装を選択します。
警告
enumerable_thread_specific
は、std::this_thread::get_id()
によって返される OS 固有の値からスレッドを識別します。この値は、スレッドの存続期間を除き、一意であることは保証されません。新しく作成されたスレッドは、すでに破棄されたスレッドと同じ OS 固有の ID を取得することがあります。enumerable_thread_specific
の要素数は、local()
を呼び出した実際のスレッド数よりも少なくなる可能性があり、スレッドによる enumerable_thread_specific
の最初の参照によって返される要素は、新規に構築されない可能性があります。
メンバー関数
非メンバーのタイプと定数
- enum ets_key_usage_type::ets_key_per_instance
enumerable_thread_specific
インスタンスごとに 1 つのネイティブ TLS キーを使用する実装を選択する際に使用される列挙パラメーター・タイプ。ネイティブ TLS キーの数は制限されており、かなり少なくなる可能性があります。
- enum ets_key_usage_type::ets_no_key
ネイティブ TLS キーを使用しない実装を選択する際に使用される列挙パラメーター・タイプ。ETS_key_usage_type
パラメーターのタイプが指定されない場合、デフォルトで ets_no_key
が使用されます。
- enum ets_key_usage_type::ets_suspend_aware
oneapi::tbb::task::suspend
関数は、enumerable_thread_specific
オブジェクトの値を変更できます。この問題を回避するには、ets_suspend_aware
列挙パラメーター・タイプを使用します。local()
値は異なるスレッドで同じにできますが、2 つの異なるスレッドが同時に同じ値をアクセスすることはできません。