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

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

#include "nn/nlib/LockFree.h"

公開メンバ関数

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

詳解

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

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

テンプレート引数
Nバッファ・サイズです。2のべき乗である必要があります。
説明
データはバッファを介してコピーされることに注意してください。 それ程大きくないデータのやりとりに向いています。 LockFreePipeを2つ使うことで2つのスレッド間でデータの送受信を行うことができます。
以下がコード例です。
std::thread sender([&]() {
// send strlen(text), text
const int kTextListLength = 4;
const char* text_list[kTextListLength] = {
"012",
"short text",
"0123456789012345678901234567890",
"#end"
};
for (int i = 0; i < kTextListLength; ++i) {
const char* text = text_list[i];
uint8_t text_len = static_cast<uint8_t>(nlib_strlen(text));
while (pipe.Write(&text_len, sizeof(text_len)) != 0) {
std::this_thread::yield();
}
while (pipe.Write(text, text_len) != 0) { std::this_thread::yield(); }
}
});
std::thread receiver([&]() {
for (;;) {
uint8_t text_len;
char buf[256];
while (pipe.Read(&text_len, sizeof(text_len)) != 0) {
std::this_thread::yield();
}
while (pipe.Read(&buf[0], text_len) != 0) { std::this_thread::yield(); }
buf[text_len] = '\0';
if (text_len == 4 && nlib_memcmp("#end", buf, text_len) == 0) { return; }
nlib_printf("Received: %s\n", buf);
}
});
sender.join();
receiver.join();
/*
Output:
Received: 012
Received: short text
Received: 0123456789012345678901234567890
*/

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

関数詳解

◆ Read()

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

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

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

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

◆ 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.h383 行目に定義があります。


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