nlib
nn::nlib::threading::Barrier クラスfinal

任意の数のスレッドを同期するために使用します。 [詳解]

#include "nn/nlib/threading/Barrier.h"

公開メンバ関数

errno_t Init (unsigned int count) noexcept
 バリアを初期化します。 [詳解]
 
errno_t Wait () noexcept
 スレッドの待ち合わせを行います。 [詳解]
 

詳解

任意の数のスレッドを同期するために使用します。

説明
Init()関数で同期するスレッド数(Nとする)を設定します。 Wait()関数を呼び出すと、到達したスレッド数がNに満たない場合はそのスレッドは停止します。 到達したスレッド数がNになった段階で全てのスレッドが起床し実行を再開します。 この際にカウンタがリセットされ、再びWait()関数に到達するとスレッドが停止するようになります。
以下がコード例です。
const int kNumThread = 4;
std::thread th_list[kNumThread];
nlib_ns::threading::Barrier barrier;
errno_t e = barrier.Init(kNumThread);
SUCCEED_IF(e == 0);
for (auto& th : th_list) {
th = std::thread([](void* p) {
nlib_barrier* pbarrier = reinterpret_cast<nlib_barrier*>(p);
nlib_printf("Thread %d Step1\n", GetMyThreadId());
nlib_barrier_wait(pbarrier); // blocks until kNumThread threads comes here
nlib_printf("Thread %d Step2\n", GetMyThreadId());
nlib_barrier_wait(pbarrier); // blocks until kNumThread threads comes here
}, &barrier);
}
for (auto& th : th_list) {
th.join();
}
/*
Output:
Thread 2388 Step1
Thread 15328 Step1
Thread 8488 Step1
Thread 16144 Step1
Thread 16144 Step2
Thread 15328 Step2
Thread 8488 Step2
Thread 2388 Step2
*/

Barrier.h33 行目に定義があります。

関数詳解

◆ Init()

nn::nlib::threading::Barrier::Init ( unsigned int  count)
inlinenoexcept

バリアを初期化します。

引数
[in]count待ち合わせするスレッドの数
戻り値
0エラーは発生していません。
EINVALcount が0の場合
ENOMEMシステムリソースが足りない場合

Barrier.h43 行目に定義があります。

◆ Wait()

nn::nlib::threading::Barrier::Wait ( )
inlinenoexcept

スレッドの待ち合わせを行います。

戻り値
0エラーは発生していません。
EBADFInit()関数が呼ばれていない場合
ENOMEMシステムリソースが足りない場合

Barrier.h51 行目に定義があります。


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