並列操作を含む優先度キュー用のテンプレート・クラス。
template<typename T, typename Alloc = cache_aligned_allocator<T> > class concurrent_priority_queue;
#include "tbb/concurrent_priority_queue.h"
concurrent_priority_queue は、複数のスレッドがアイテムのプッシュとポップを同時に行うことができるコンテナーです。アイテムは、テンプレート引数により決定された優先度順にポップされます。キューの大きさは無制限で、対象のマシン上のメモリー制限に従います。
インターフェイスは、同時変更を安全に行えるようにしている点を除いて、STL std::priority_queue に似ています。
機能 |
STL std::priority_queue |
concurrent_priority_queue |
---|---|---|
コンテナーの選択 |
シーケンス・テンプレート引数 |
コンテナーの選択なし。代わりに、アロケーターの選択が提供されます。 |
優先度の最も高いアイテムへのアクセス |
const value_type& top() const |
なし。コンカレント・コンテナーでは安全ではありません。 |
アイテムがある場合のコピーおよびポップ |
bool b=!q.empty(); if(b) { x=q.top(); q.pop(); } |
bool b = q.try_pop(x); |
キューの中のアイテム数の取得 |
size_type size() const |
同じ。ただし、保留中の並列に処理されるプッシュまたはポップ操作がある場合は正しくない可能性があります。 |
キューにアイテムがあるかどうかの確認 |
bool empty() const |
同じ。ただし、保留中の並列に処理されるプッシュまたはポップ操作がある場合は正しくない可能性があります。 |
namespace tbb { template <typename T, typename Compare=std::less<T>, typename A=cache_aligned_allocator<T> > class concurrent_priority_queue { public: typedef T value_type; typedef T& reference; typedef const T& const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef A allocator_type; // コンストラクター concurrent_priority_queue(const allocator_type& a = allocator_type()); concurrent_priority_queue(size_type init_capacity, const allocator_type& a = allocator_type()); template<typename InputIterator> concurrent_priority_queue(InputIterator begin, InputIterator end, const allocator_type& a = allocator_type()); concurrent_priority_queue(const concurrent_priority_queue& src, const allocator_type& a = allocator_type()); // C++11 仕様 concurrent_priority_queue(concurrent_priority_queue&& src); concurrent_priority_queue(concurrent_priority_queue&& src, const allocator_type& a); concurrent_priority_queue(std::initializer_list<T> il, const allocator_type &a = allocator_type()); // 代入 concurrent_priority_queue& operator=(const concurrent_priority_queue& src); template<typename InputIterator> void assign(InputIterator begin, InputIterator end); // C++11 仕様 concurrent_priority_queue& operator=(concurrent_priority_queue&& src); concurrent_priority_queue& operator=(std::initializer_list<T> il); void assign(std::initializer_list<T> il); void swap(concurrent_priority_queue& other); ~concurrent_priority_queue(); allocator_type get_allocator() const; bool empty() const; size_type size() const; void push(const_reference elem); // C++11 仕様 void push(T&& elem); template<typename... Args> void emplace(Args&&... args); bool try_pop(reference elem); void clear(); }; }
メンバー | 説明 |
---|---|
concurrent_priority_queue(const allocator_type& a = allocator_type()) |
空のキューを構築します。 |
concurrent_priority_queue(size_type init_capacity, const allocator_type& a = allocator_type()) |
キャパシティーの初期値で空のキューを構築します。 |
template <typename InputIterator> concurrent_priority_queue(InputIterator begin, InputIterator end, const allocator_type& a = allocator_type()) |
半開区間 [begin, end) のイテレーターの要素のコピーを含むテーブルを構築します。 |
concurrent_priority_queue(std::initializer_list<T> il, const allocator_type &a = allocator_type()) |
C++11 仕様。concurrent_priority_queue(il.begin(), il.end(), a) と等価です。 |
concurrent_priority_queue(const concurrent_priority_queue& src, const allocator_type& a = allocator_type()) |
src のコピーを構築します。この操作はスレッドセーフではありません。別のスレッドが同時に src を変更すると、エラーが発生したり、src の無効なコピーが構築される可能性があります。 |
concurrent_priority_queue(concurrent_priority_queue&& src) |
C++11 仕様。src のコンテンツを移動することにより新しいキューを構築します。src は無指定の状態のままですが、安全に破棄することができます。src キューに保留中の並列操作がある場合、この操作は安全ではありません。 |
concurrent_priority_queue(concurrent_priority_queue&& src, const allocator_type& a) |
C++11 仕様。アロケーター a を使用して src のコンテンツを移動することにより新しいキューを構築します。src は無指定の状態のままですが、安全に破棄することができます。src キューに保留中の並列操作がある場合、この操作は安全ではありません。 |
concurrent_priority_queue& operator=(const concurrent_priority_queue& src) |
src のコンテンツを *this に代入します。この操作はスレッドセーフではありません。別のスレッドが同時に src を変更すると、エラーが発生したり、src の無効なコピーが構築される可能性があります。 戻り値: 計算後の *this への参照。 |
concurrent_priority_queue& operator=(concurrent_priority_queue&& src); |
C++11 仕様。src から *this にデータを移動します。src は無指定の状態のままですが、安全に破棄することができます。src キューに保留中の並列操作がある場合、この操作は安全ではありません。 戻り値: 計算後の *this への参照。 |
concurrent_priority_queue& operator=(std::initializer_list<T> il) |
C++11 仕様。初期化子リスト il のコンテンツを *this に代入します。 戻り値: 計算後の *this への参照。 |
template <typename InputIterator> void assign(InputIterator begin, InputIterator end, const allocator_type&) |
半開区間 [begin, end) のイテレーターのコンテンツを *this に代入します。 |
void assign(std::initializer_list<T> il) |
C++11 仕様。assign(il.begin(), il.end()) と等価です。 |
~concurrent_priority_queue() |
コンテナーが使用されないように、キュー内のすべてのアイテムとコンテナーを破棄します。 |
bool empty() const |
戻り値: キューにアイテムがない場合は true。その他の場合は false。並列に処理される push 操作または try_pop 操作が保留中の場合は、戻り値が正しくない可能性があります。この操作は共有データを読み取ります。この操作を同時に使用した場合、競合状態を発見するツールで競合状態が検出されることがあります。 |
size_type size() const |
戻り値: キューのアイテムの数。並列に処理される push 操作または try_pop 操作が保留中の場合は、戻り値が正しくない可能性があります。この操作は共有データを読み取ります。この操作を同時に使用した場合、競合状態を発見するツールで競合状態が検出されることがあります。 |
void push(const_reference elem) |
elem のコピーをキューにプッシュします。この操作はスレッドセーフです。ほかの push 操作、try_pop 操作、および emplace 操作とともに使用できます。 |
void push(T&& elem) |
C++11 仕様。move コンストラクターを使用して指定された要素をキューにプッシュします。この操作はスレッドセーフです。ほかの push 操作、try_pop 操作、および emplace 操作とともに使用できます。 |
template<typename... Args> void emplace(Args&&... args); |
C++11 仕様。新しい要素をキューにプッシュします。要素は指定された引数で構築されます。この操作はスレッドセーフです。ほかの push 操作、try_pop 操作、および emplace 操作とともに使用できます。 |
bool try_pop(reference elem) |
キューが空でない場合、キューから優先度の最も高いアイテムをコピーして elem に割り当て、キューからポップしたアイテムを破棄します。その他の場合は、何もしません。この操作はスレッドセーフです。ほかの push 操作、try_pop 操作、および emplace 操作とともに使用できます。 戻り値: アイテムがポップされた場合は true、その他の場合は false。 |
void clear() |
キューを消去します。これにより、size()==0 になります。この操作はスレッドセーフではありません。 |
void swap(concurrent_priority_queue& other) |
キューのコンテンツを other のコンテンツとスワップします。この操作はスレッドセーフではありません。 |
allocator_type get_allocator() const |
戻り値: キューの構築に使用されるアロケーターのコピー。 |