nlib
misc/threading/barrier/barrier.cpp

スレッドの待ち合わせを行うバリアを利用するサンプルです。

BarrierDemo()関数では以下のことを行なっています。

  1. nn::nlib::threading::Barrier::Init()関数で待ち合わせスレッドの数をkNumThread個に設定します。
  2. スレッドをkNumThread個立ち上げ、ThreadFunc()を実行させます。

ThreadFunc()関数ではコンソールへの表示を行う度に他のスレッドを待ち合わせています。

/*--------------------------------------------------------------------------------*
Project: CrossRoad
Copyright (C)Nintendo All rights reserved.
These coded instructions, statements, and computer programs contain proprietary
information of Nintendo and/or its licensed developers and are protected by
national and international copyright laws. They may not be disclosed to third
parties or copied or duplicated in any form, in whole or in part, without the
prior written consent of Nintendo.
The content herein is highly confidential and should be handled accordingly.
*--------------------------------------------------------------------------------*/
using ::nlib_ns::threading::Barrier;
using ::nlib_ns::threading::Thread;
const int kNumThread = 8;
Thread g_th[kNumThread];
Barrier g_barrier;
void ThreadFunc(int n) {
nlib_printf("Thread %d: Step 1\n", n);
g_barrier.Wait(); // blocks until kNumThread threads comes here
nlib_printf("Thread %d: Step 2\n", n);
g_barrier.Wait(); // blocks until kNumThread threads comes here
nlib_printf("Thread %d: Step 3\n", n);
g_barrier.Wait(); // blocks until kNumThread threads comes here
}
bool BarrierDemo() {
nlib_printf("%d threads run, and sync by a Barrier object.\n", kNumThread);
nlib_printf("The Barrier object can sync mutiple times.\n\n");
g_barrier.Init(kNumThread);
int i;
for (i = 0; i < kNumThread; ++i) {
g_th[i].Start(ThreadFunc, i);
}
for (i = 0; i < kNumThread; ++i) {
g_th[i].Join();
}
return true;
}
static bool SampleMain(int, char**) { return BarrierDemo(); }
NLIB_MAINFUNC