3.1.5. pfi::concurrent::pcbuf¶
3.1.5.1. 概要¶
Producer-Consumer Buffer。作成時に容量の上限の指定ができ、タイムアウト付きのpush/popができるのが特徴である。
3.1.5.2. 使い方¶
explicit pcbuf<T>::pcbuf(size_t capacity)
容量の上限を指定して空のキューを作る。
void pcbuf<T>::push(const T& value)
キューにvalueを追加する。 キューが満杯なら空きができるまで待つ。
bool pcbuf<T>::push(const T& value, double second)
キューにvalueを追加する。 キューが満杯のときは、タイムアウト付き(タイムアウト時間はsecond秒)で空きができるのを待つ。 キューに要素を追加できたときはtrueを、そうでない(タイムアウト)ならfalseを返す。
void pcbuf<T>::pop(T& value)
キューから取り出してvalueに入れる。 キューが空なら追加されるまで待つ。
bool pcbuf<T>::pop(T& value, double second)
キューから取り出してvalueに入れる。 キューが空のときは、タイムアウト付き(タイムアウト時間はsecond秒)で要素が追加されるのを待つ。 キューから要素を取り出せたときはtrueを、そうでない(タイムアウト)ならfalseを返す。
void pcbuf<T>::clear()
キューを空にする。
size_t pcbuf<T>::size() const
キューに格納している要素の数を返す。
size_t pcbuf<T>::capacity() const
キューに格納できる要素の最大数を返す。
bool pcbuf<T>::empty() const
キューに格納している要素の数が0であるならtrueを、そうでないないならfalseを返す。
3.1.5.3. サンプルコード¶
pcbuf<int> q(7); // int型を7個まで格納できるキューを作る
q.push(2); // 2をキューに追加する
int v;
q.pop(v); // 2をキューから取り出してvに入れる。
if (!q.push(3, 0.1)) { // 3をキューに追加する(タイムアウトは0.1秒に設定)
cerr << "push timeout" << endl;
}
if (!q.pop(v, 0.5)) { // 3をキューから取り出してvに入れる(タイムアウトは0.5秒に設定)
cerr << "pop timeout" << endl;
}