最終更新日時:
が更新

履歴 編集

ロックフリーキュー

ロックフリーキューには、Boost Lockfree Libraryboost::lockfree::queueクラスを使用する。

インデックス

基本的な使い方

ここでは、ロックフリーキューの基本的な使い方を示す。以下は、Producer-Consumerパターンで、一方のスレッドがキューに値を供給し、もう一方のスレッドがキューの値を消費する処理を行っている。

#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
…

要素型

キューに格納する型は、boost::lockfree::queueクラステンプレートの第1テンプレート引数で指定する。

コンストラクタ

boost::lockfree::queueクラスのコンストラクタでは、キューの最大容量を設定する。最大容量を設定しない構築はできない。

キューへの追加&取り出し操作は、最大容量を超えない範囲で行う。

値の追加

値の追加には、queue::push()メンバ関数を使用する。

この関数は失敗する可能性があるため、追加に成功したかどうかをboolで返す。

値の取り出し

値の取り出しには、queue::pop()メンバ関数を使用する。

この関数は、取り出した値をパラメータの参照で返し、取り出しに成功したらtrue、失敗したらfalseを返す。

キューに格納可能な型

boost::lockfree::queueクラスには、要素型としてtrivially copyable(memcpy可能)な型のみを格納できる。

参照: Boost.Lockfree ロックフリーキューの制限

documented boost version is 1.53.0