Boost.Lockfree ロックフリーキュー

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