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

指定された数のリスナーがキューから要素を取得できます。全てのリスナーが取得後、要素はキューから削除されます。 [詳解]

#include "nn/nlib/LockFree.h"

公開型

typedef UniquePtr< const T, empty_func > DequeueType
 Dequeue(), DequeueUnsafe()の引数となる型です
 

公開メンバ関数

 LockFreeBroadcastQueue () noexcept
 デフォルトコンストラクタです。
 
 ~LockFreeBroadcastQueue () noexcept
 デストラクタです。 [詳解]
 
errno_t Init (size_t max_size, size_t listeners) noexcept
 キューを初期化します。スレッドセーフではありません。 [詳解]
 
errno_t Enqueue (const T *obj) noexcept
 キューに要素を追加します。スレッドセーフです。 [詳解]
 
errno_t Dequeue (int32_t listener_id, DequeueType &obj) noexcept
 リスナーを指定してキューから要素を読み込みます。異なるlistener_idを利用している場合はスレッドセーフです。 [詳解]
 
size_t GetListenerCount () const noexcept
 Init()で指定したリスナーの数を返します。スレッドセーフです。
 

詳解

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

指定された数のリスナーがキューから要素を取得できます。全てのリスナーが取得後、要素はキューから削除されます。

テンプレート引数
Tキューの要素の型です。
説明
全てのリスナーが取得を終えるまでは、要素となるオブジェクトは破壊されないので注意してください。
コード例
class BroadcastMsg {
public:
BroadcastMsg(const char* msg) {
size_t bufsize = nlib_strlen(msg) + 1;
msg_ = new char[bufsize];
nlib_strcpy(msg_, bufsize, msg);
}
~BroadcastMsg() { delete msg_; }
const char* Get() const { return msg_; }
private:
char* msg_;
};
.....
LockFreeBroadcastQueue<BroadcastMsg> queue;
queue.Init(128, 2);
queue.Enqueue(new BroadcastMsg("The messages are shared among the listeners."));
queue.Enqueue(new BroadcastMsg("They are preserved until all the listeners read them."));
queue.Enqueue(new BroadcastMsg("They are to be deleted automatically."));
......
{
// Thread 1
LockFreeBroadcastQueue<BroadcastMsg>::DequeueType ptr;
queue.Dequeue(0, ptr);
PrintMsgOnWindow1(ptr->Get());
queue.Dequeue(0, ptr);
PrintMsgOnWindow1(ptr->Get());
queue.Dequeue(0, ptr);
PrintMsgOnWindow1(ptr->Get());
}
......
{
// Thread 2
LockFreeBroadcastQueue<BroadcastMsg>::DequeueType ptr;
queue.Dequeue(0, ptr);
PrintMsgOnWindow2(ptr->Get());
queue.Dequeue(0, ptr);
PrintMsgOnWindow2(ptr->Get());
queue.Dequeue(0, ptr);
PrintMsgOnWindow2(ptr->Get());
}

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

構築子と解体子

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

デストラクタです。

説明
キューに要素が残っている場合はDestructorForLockFree<const T>により解体されます。

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

関数詳解

template<class T >
nn::nlib::LockFreeBroadcastQueue< T >::Dequeue ( int32_t  listener_id,
DequeueType obj 
)
inlinenoexcept

リスナーを指定してキューから要素を読み込みます。異なるlistener_idを利用している場合はスレッドセーフです。

引数
[in]listener_id0以上かつInit()で指定したリスナーの数未満の整数
[out]obj読み込まれた要素
戻り値
0成功した場合
EAGAIN新たに読み取れる要素がキューにない場合
説明
取得した要素は、次にDequeue()するまで有効です。 全てのリスナーがDequeue()を終えないとキューから要素が削除されないことに注意してください。

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

template<class T >
nn::nlib::LockFreeBroadcastQueue< T >::Enqueue ( const T *  obj)
inlinenoexcept

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

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

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

template<class T >
nn::nlib::LockFreeBroadcastQueue< T >::Init ( size_t  max_size,
size_t  listeners 
)
inlinenoexcept

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

引数
[in]max_sizeキューに格納できる要素の最大数
[in]listenersリスナーの数
戻り値
0成功した場合
EINVALmax_sizeINT32_MAXを超えている場合
ENOMEMメモリの確保に失敗した場合

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


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