nlib
nn::nlib::LockFreeQueue< T > クラステンプレートfinal

ロックフリーなキューを実装しているクラスです。 [詳解]

#include "nn/nlib/LockFree.h"

公開型

typedef T * DequeueType
 Dequeue(), DequeueUnsafe()の引数となる型です [詳解]
 

公開メンバ関数

errno_t Enqueue (const T &x) noexcept
 キューに要素xを追加します。スレッドセーフです。 [詳解]
 
errno_t Dequeue (DequeueType x) noexcept
 キューから要素を取り出してxに格納します。スレッドセーフです。 [詳解]
 
errno_t EnqueueUnsafe (const T &x) noexcept
 キューに要素xを追加します。スレッドセーフではありません。 [詳解]
 
errno_t DequeueUnsafe (DequeueType x) noexcept
 キューから要素を取り出してxに格納します。スレッドセーフではありません。 [詳解]
 
void SwapUnsafe (LockFreeQueue &rhs) noexcept
 オブジェクトをスワップします。スレッドセーフではありません。
 
コンストラクタ、デストラクタ、及び初期化
 LockFreeQueue () noexcept
 デフォルトコンストラクタです。
 
 ~LockFreeQueue () noexcept
 デストラクタです。 [詳解]
 
errno_t Init (size_t count) noexcept
 キューを初期化します。スレッドセーフではありません。 [詳解]
 

詳解

template<class T>
class nn::nlib::LockFreeQueue< T >

ロックフリーなキューを実装しているクラスです。

テンプレート引数
Tキューの要素の型です。PODである必要があります。
説明
Enqueue()及びDequeue()メンバ関数がスレッドセーフです。 Tにポインタ型を指定した場合、キューに追加されたT型のオブジェクトはDestructorForLockFreeを利用して削除されます。
struct Pod { nlib_thread_id threadid; };
errno_t e = queue.Init(128);
SUCCEED_IF(e == 0);
const int kNumThread = 8;
std::thread th_list[kNumThread];
for (auto& th : th_list) {
th = std::thread([&]() {
Pod pod;
pod.threadid = GetMyThreadId();
for (int i = 0; i < 2; ++i) {
while (queue.Enqueue(pod) != 0) {
}
nlib_sleep(10000);
}
});
}
for (auto& th : th_list) { th.join(); }
Pod pod;
for (int i = 0; i < kNumThread * 2; ++i) {
e = queue.DequeueUnsafe(&pod); // you can use DequeueUnsafe/DequeueUnsafe if single threaded
SUCCEED_IF(e == 0);
nlib_printf("dequeue: threadid = %d\n", pod.threadid);
}
SUCCEED_IF(queue.DequeueUnsafe(&pod) == EAGAIN); // empty
/*
Output:
dequeue: threadid = 18992
dequeue: threadid = 10128
dequeue: threadid = 19896
dequeue: threadid = 12040
dequeue: threadid = 10120
dequeue: threadid = 23808
dequeue: threadid = 4872
dequeue: threadid = 19440
dequeue: threadid = 19896
dequeue: threadid = 4872
dequeue: threadid = 19440
dequeue: threadid = 10128
dequeue: threadid = 23808
dequeue: threadid = 18992
dequeue: threadid = 12040
dequeue: threadid = 10120
*/
参照
http://www.cs.rochester.edu/~scott/papers/1996_PODC_queues.pdf

LockFree.h514 行目に定義があります。

型定義メンバ詳解

◆ DequeueType

template<class T>
nn::nlib::LockFreeQueue< T >::DequeueType

Dequeue(), DequeueUnsafe()の引数となる型です

説明
Tがポインタ型の場合はDestructorForLockFreeで自動的にデストラクトされるようにUniquePtrがtypedefされています。

LockFree.h516 行目に定義があります。

構築子と解体子

◆ ~LockFreeQueue()

template<class T>
nn::nlib::LockFreeQueue< T >::~LockFreeQueue ( )
inlinenoexcept

デストラクタです。

説明
要素が残っている場合は、それぞれの要素をDestructorForLockFreeを利用して削除します。 必要な場合は関数テンプレートを特殊化して必要な処理を実行してください。

LockFree.h518 行目に定義があります。

関数詳解

◆ Dequeue()

template<class T>
nn::nlib::LockFreeQueue< T >::Dequeue ( DequeueType  x)
inlinenoexcept

キューから要素を取り出してxに格納します。スレッドセーフです。

引数
[in]xキューから取りだされた要素が格納される領域
戻り値
0成功した場合
EAGAINキューが空の場合

LockFree.h529 行目に定義があります。

◆ DequeueUnsafe()

template<class T>
nn::nlib::LockFreeQueue< T >::DequeueUnsafe ( DequeueType  x)
inlinenoexcept

キューから要素を取り出してxに格納します。スレッドセーフではありません。

引数
[in]xキューから取りだされた要素が格納される領域
戻り値
0成功した場合
EAGAINキューが空の場合

LockFree.h533 行目に定義があります。

◆ Enqueue()

template<class T>
nn::nlib::LockFreeQueue< T >::Enqueue ( const T &  x)
inlinenoexcept

キューに要素xを追加します。スレッドセーフです。

引数
[in]xキューに追加される要素
戻り値
0成功した場合
EAGAINキューが一杯の場合

LockFree.h528 行目に定義があります。

◆ EnqueueUnsafe()

template<class T>
nn::nlib::LockFreeQueue< T >::EnqueueUnsafe ( const T &  x)
inlinenoexcept

キューに要素xを追加します。スレッドセーフではありません。

引数
[in]xキューに追加される要素
戻り値
0成功した場合
EAGAINキューが一杯の場合

LockFree.h531 行目に定義があります。

◆ Init()

template<class T>
nn::nlib::LockFreeQueue< T >::Init ( size_t  count)
inlinenoexcept

キューを初期化します。スレッドセーフではありません。

引数
[in]countキューに追加することの出来る要素の数
戻り値
0成功した場合
ENOMEMメモリの確保に失敗した場合
EALREADY既に初期化済みの場合

LockFree.h522 行目に定義があります。


このクラス詳解は次のファイルから抽出されました: