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

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

#include "nn/nlib/LockFree.h"

公開型

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

公開メンバ関数

 LockFreeQueue () noexcept
 デフォルトコンストラクタです。
 
 ~LockFreeQueue () noexcept
 デストラクタです。 [詳解]
 
errno_t Init (size_t count) noexcept
 キューを初期化します。スレッドセーフではありません。 [詳解]
 
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
 オブジェクトをスワップします。スレッドセーフではありません。
 

詳解

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

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

テンプレート引数
Tキューの要素の型です。PODである必要があります。
説明
Enqueue()及びDequeue()メンバ関数がスレッドセーフです。 Tにポインタ型を指定した場合、キューに追加されたT型のオブジェクトはDestructorForLockFreeを利用して削除されます。
コード例
LockFreeQueue<MyClass*> queue;
e = queue.Init(1024);
if (nlib_is_error(e)) {
// ERROR
}
.....
MyClass* elem = new MyClass();
.....
e = queue.Enqueue(elem);
if (nlib_is_error(e)) {
// try again or ERROR
}
.....
LockFreeQueue<MyClass*>::DequeueType x;
e = queue.Dequeue(x);
if (nlib_is_error(e)) {
// try again or ERROR
}
.....
// x is automatically deleted
参照
http://www.cs.rochester.edu/~scott/papers/1996_PODC_queues.pdf

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

型定義メンバ詳解

§ DequeueType

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

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

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

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

構築子と解体子

§ ~LockFreeQueue()

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

デストラクタです。

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

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

関数詳解

§ Dequeue()

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

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

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

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

§ DequeueUnsafe()

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

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

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

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

§ Enqueue()

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

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

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

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

§ EnqueueUnsafe()

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

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

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

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

§ Init()

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

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

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

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


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