Boost 1.53.0には、Boost.Lockfreeという並行コンテナのライブラリが入りました。
このライブラリにはスタックとキューが用意されていますが、よく使うのはキューの方でしょう。
使い方は以下のようになります。
#include <iostream> #include <thread> #include <boost/lockfree/queue.hpp> boost::lockfree::queue<int> que(128); void producer() { for (int i = 0;; ++i) { while (!que.push(i)) {} } } void consumer() { for (;;) { int x = 0; if (que.pop(x)) { std::cout << x << std::endl; } } } int main() { std::thread t1(producer); std::thread t2(consumer); t1.join(); t2.join(); }
0 1 2 3 4 …
ここでは、並行キューを使う主な状況として、Producer-Consumerパターンを書いています。片方のスレッドで値を供給し、他のスレッドでは供給された値を消費します。
queueクラスは、コンストラクタで最大容量を設定して使用します。
キューへの追加は、push()メンバ関数を使用します。この関数は失敗する可能性があるので、boolを返します。成功するまで繰り返し適用する形で使用します。
キューからの値の取り出しは、pop()メンバ関数を使用します。まだ要素が追加されていない可能性があるので、boolを返します。これも取り出せるまで繰り返し適用します。
基本的な使い方は以上になります。より踏み込んだ内容は、追々調べつつ紹介していきます。
参照:
queue class - Boost Lockfree Library