nlib
nn::nlib::LockFreePipe< N > クラステンプレートfinal

データの送り手側のスレッドと受け手側のスレッドがそれぞれ1つずつの場合、このクラスを用いてロックフリーにデータの受け渡しを行うことができます。 [詳解]

#include "nn/nlib/LockFree.h"

公開メンバ関数

 LockFreePipe () noexcept
 デフォルトコンストラクタです。
 
size_t GetBufferSize () noexcept
 バッファ・サイズを返します。スレッドセーフです。
 
errno_t Read (void *dest, size_t nbytes) noexcept
 データをパイプから読み込みます。スレッドセーフです。 [詳解]
 
errno_t Write (const void *src, size_t nbytes) noexcept
 データをパイプに書き込みます。スレッドセーフです。 [詳解]
 

詳解

template<size_t N>
class nn::nlib::LockFreePipe< N >

データの送り手側のスレッドと受け手側のスレッドがそれぞれ1つずつの場合、このクラスを用いてロックフリーにデータの受け渡しを行うことができます。

テンプレート引数
Nバッファ・サイズです。2のべき乗である必要があります。
説明
データはバッファを介してコピーされることに注意してください。 それ程大きくないデータのやりとりに向いています。 LockFreePipeを2つ使うことで2つのスレッド間でデータの送受信を行うことができます。
コード例
LockFreePipe<1024> pipe;
.....
{
// master thread
.....
uint8_t command[16];
.....
// Send the command to the slave thread
while (pipe.Write(command, sizeof(command)) != 0) {
nlib_yield(); // or do other things
}
.....
}
{
// slave thread
.....
uint8_t command[16];
// Receive the command from the master thread
while (pipe.Read(command, sizeof(command)) != 0) {
nlib_yield(); // or do other things
}
// process command
.....
}

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

関数詳解

◆ Read()

template<size_t N>
nn::nlib::LockFreePipe< N >::Read ( void *  dest,
size_t  nbytes 
)
inlinenoexcept

データをパイプから読み込みます。スレッドセーフです。

引数
[out]dest読み込んだデータが格納される領域
[in]nbytes読み込むバイト数
戻り値
0成功した場合
EAGAINバッファにnbytes未満のデータしかない場合

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

◆ Write()

template<size_t N>
nn::nlib::LockFreePipe< N >::Write ( const void *  src,
size_t  nbytes 
)
inlinenoexcept

データをパイプに書き込みます。スレッドセーフです。

引数
[in]src書きこむデータが格納される領域
[in]nbytes書き込むバイト数
戻り値
0成功した場合
EAGAINバッファの空き容量がnbytes未満の場合

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


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