スレッドの待ち合わせを行うバリアを利用するサンプルです。
BarrierDemo()
関数では以下のことを行なっています。
-
nn::nlib::threading::Barrier::Init()
関数で待ち合わせスレッドの数をNUM_THREAD
個に設定します。
-
スレッドを
NUM_THREAD
個立ち上げ、ThreadFunc()
を実行させます。
ThreadFunc()
関数ではコンソールへの表示を行う度に他のスレッドを待ち合わせています。
using ::nlib_ns::threading::Barrier;
using ::nlib_ns::threading::Thread;
const int NUM_THREAD = 8;
Thread g_Th[NUM_THREAD];
Barrier g_Barrier;
void ThreadFunc(int n) {
g_Barrier.Wait();
g_Barrier.Wait();
g_Barrier.Wait();
}
bool BarrierDemo() {
nlib_printf(
"%d threads run, and sync by a Barrier object.\n", NUM_THREAD);
nlib_printf(
"The Barrier object can sync mutiple times.\n\n");
g_Barrier.Init(NUM_THREAD);
int i;
for (i = 0; i < NUM_THREAD; ++i) {
g_Th[i].Start(ThreadFunc, i);
}
for (i = 0; i < NUM_THREAD; ++i) {
g_Th[i].Join();
}
return true;
}
static bool SampleMain(int, char**) { return BarrierDemo(); }
NLIB_MAINFUNC