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

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

#include "nn/nlib/LockFree.h"

公開型

typedef T * PopType
 Pop(), PopUnsafe()の引数となる型です [詳解]
 

公開メンバ関数

errno_t Push (const T &x) noexcept
 スタックに要素xを積みます。スレッドセーフです。 [詳解]
 
errno_t Pop (PopType x) noexcept
 スタックから要素を取り出してxに格納します。スレッドセーフです。 [詳解]
 
errno_t PushUnsafe (const T &x) noexcept
 スタックに要素xを積みます。スレッドセーフではありません。 [詳解]
 
errno_t PopUnsafe (PopType x) noexcept
 スタックから要素を取り出してxに格納します。スレッドセーフではありません。 [詳解]
 
void SwapUnsafe (LockFreeStack &rhs) noexcept
 オブジェクトをスワップします。スレッドセーフではありません。
 
コンストラクタ、デストラクタ、及び初期化
 LockFreeStack () noexcept
 デフォルトコンストラクタです。
 
 ~LockFreeStack () noexcept
 デストラクタです。 [詳解]
 
errno_t Init (size_t count) noexcept
 スタックを初期化します。スレッドセーフではありません。 [詳解]
 

詳解

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

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

テンプレート引数
Tスタックに積む要素の型です。PODである必要があります。
説明
Push()及びPop()メンバ関数がスレッドセーフです。 Tにポインタ型を指定した場合、スタックに積まれたT型のオブジェクトはDestructorForLockFreeによって自動的に削除されます。
以下がコード例です。
struct Pod { nlib_thread_id threadid; };
errno_t e = stack.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 (stack.Push(pod) != 0) {
}
nlib_sleep(10000);
}
});
}
for (auto& th : th_list) { th.join(); }
Pod pod;
for (int i = 0; i < kNumThread * 2; ++i) {
e = stack.PopUnsafe(&pod); // you can use PushUnsafe/PopUnsafe if single threaded
SUCCEED_IF(e == 0);
nlib_printf("pop: threadid = %d\n", pod.threadid);
}
SUCCEED_IF(stack.PopUnsafe(&pod) == EAGAIN); // empty
/*
Output:
pop: threadid = 24248
pop: threadid = 14012
pop: threadid = 21972
pop: threadid = 7384
pop: threadid = 17956
pop: threadid = 19628
pop: threadid = 21608
pop: threadid = 16848
pop: threadid = 24248
pop: threadid = 14012
pop: threadid = 17956
pop: threadid = 19628
pop: threadid = 7384
pop: threadid = 21972
pop: threadid = 21608
pop: threadid = 16848
*/

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

型定義メンバ詳解

◆ PopType

template<class T>
nn::nlib::LockFreeStack< T >::PopType

Pop(), PopUnsafe()の引数となる型です

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

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

構築子と解体子

◆ ~LockFreeStack()

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

デストラクタです。

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

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

関数詳解

◆ Init()

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

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

引数
[in]countスタックに積むことのできる要素の数
戻り値
0成功した場合
ENOMEMメモリの確保に失敗した場合
EALREADY既に初期化済みの場合

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

◆ Pop()

template<class T>
nn::nlib::LockFreeStack< T >::Pop ( PopType  x)
inlinenoexcept

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

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

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

◆ PopUnsafe()

template<class T>
nn::nlib::LockFreeStack< T >::PopUnsafe ( PopType  x)
inlinenoexcept

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

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

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

◆ Push()

template<class T>
nn::nlib::LockFreeStack< T >::Push ( const T &  x)
inlinenoexcept

スタックに要素xを積みます。スレッドセーフです。

引数
[in]xスタックに積まれる要素
戻り値
0成功した場合
EAGAINスタックが一杯の場合

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

◆ PushUnsafe()

template<class T>
nn::nlib::LockFreeStack< T >::PushUnsafe ( const T &  x)
inlinenoexcept

スタックに要素xを積みます。スレッドセーフではありません。

引数
[in]xスタックに積まれる要素
戻り値
0成功した場合
EAGAINスタックが一杯の場合

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


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