並列操作を含む優先度キュー用のテンプレート・クラス。
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 {
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());
concurrent_priority_queue& operator=(const
concurrent_priority_queue& src);
~concurrent_priority_queue();
bool empty() const;
size_type size() const;
void push(const_reference elem);
bool try_pop(reference elem);
void clear();
void swap(concurrent_priority_queue& other);
allocator_type get_allocator() const;
};
}
インテル® TBB 2.1 では、concurrent_queue は制限することができます。 インテル® TBB 2.2 では、この機能がconcurrent_bounded_queue に移動しました。 TBB_DEPRECATED=1 を指定してコンパイルすると以前の機能を使用できますが、concurrent_bounded_queue を使用することを推奨します。
| メンバー | 説明 |
|---|---|
| concurrent_priority_queue(const allocator_type& a = allocator_type()) |
空のキューを構築します。 |
| concurrent_priority_queue(size_type init_capacity, const allocator_type& a = allocator_type()) |
キャパシティーの初期値で空のキューを構築します。 |
| concurrent_priority_queue(InputIterator begin, InputIterator end, const allocator_type& a = allocator_type()) |
半開区間 [begin, end) のイテレーターの要素のコピーを含むテーブルを構築します。 |
| concurrent_priority_queue (const concurrent_priority_queue& src, const allocator_type& a = allocator_type()) |
src のコピーを構築します。 この操作はスレッドセーフではありません。別のスレッドが同時に src を変更すると、エラーが発生したり、src の無効なコピーが構築される可能性があります。 |
| concurrent_priority_queue& operator=(const concurrent_priority_queue& src) |
src の内容を *this に代入します。 この操作はスレッドセーフではありません。別のスレッドが同時に src を変更すると、エラーが発生したり、src の無効なコピーが構築される可能性があります。 |
| ~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 操作とともに使用できます。 |
| bool try_pop(reference elem) |
キューが空でない場合、キューから優先度の最も高い項目をコピーして elem に割り当て、キューからポップした項目を破棄します。その他の場合は、何もしません。 この操作はスレッドセーフです。ほかの push 操作および try_pop 操作とともに使用できます。 戻り値: 項目がポップされた場合は true、その他の場合は false。 |
| void clear() |
キューを消去します。これにより、size()==0 になります。 この操作はスレッドセーフではありません。 |
| void swap(concurrent_priority_queue& other) |
キューのコンテンツを other のコンテンツとスワップします。この操作はスレッドセーフではありません。 |
| allocator_type get_allocator() const |
戻り値: キューの構築に使用されるアロケーターのコピー。 |