nlib_once()
のサンプルです。pthreadのpthread_onceに相当します。
nlib_once()
は初期化コードが高々1回しか実行されないようにすることに利用されます。 サンプルでは複数立ち上がったスレッドがいずれもnlib_once
経由でOnceFunc
を呼び出そうとしますが、実際に実行するのは最初に到達したスレッドのみです。
他のスレッドはnlib_onceflag
の実行中はスピンして待ち、実行完了後にnlib_once
以降の処理を実行します。 つまり、nlib_once
の実行後にはOnceFunc
が必ず1回だけ呼び出されていることが保証されています。
using ::nlib_ns::threading::Thread;
const int NUM_THREAD = 8;
Thread g_Th[NUM_THREAD];
void OnceFunc() {
}
void ThreadFunc() {
}
bool CallOnceDemo() {
nlib_printf(
"%d threads tries to execute 'OnceFunc'\n", NUM_THREAD);
nlib_printf(
"nlib_once executes 'OnceFunc' only once\n\n");
int i;
for (i = 0; i < NUM_THREAD; ++i) {
g_Th[i].Start(ThreadFunc);
}
for (i = 0; i < NUM_THREAD; ++i) {
g_Th[i].Join();
}
ThreadFunc();
return true;
}
static bool SampleMain(int, char**) { return CallOnceDemo(); }
NLIB_MAINFUNC