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 つの異なるスレッドが同時に同じ値をアクセスすることはできません。