C言語でシングルトン(再入不可能な関数)を実装する方法
static 変数をフラグに使う
最も単純な方法。 次の関数は static 変数をフラグに使って再入を防いでいます。
void once(void) { static int entered = 0; if (entered == 1) { return; } entered = 1; // ここに処理を書く }
pthread の mutex を使う
比較と代入の部分を pthread の mutex で排他制御しています。 これでマルチスレッドでも大丈夫になりました。
#include <pthread.h> static pthread_mutex_t mutex= PTHREAD_MUTEX_INITIALIZER; void once(void) { static int entered; pthread_mutex_lock(&mutex); int tmp = (entered == 1); entered = 1; pthread_mutex_unlock(&mutex); if (tmp) { return; } // ここに処理を書く }
pthread_onceを使う
pthread_once() という、関数を一度だけ実行するための関数があります。 こちらを使用するとソースがだいぶスッキリ
#include <pthread.h> static void once_internal(void) { // この関数は一度しか実行されない } static pthread_once_t entered = PTHREAD_ONCE_INIT; void once(void) { pthread_once(&entered, once_internal); }
まとめ
シングルトンをCで実装してみました。 再入不可能な関数が必要な場面はいつあるのかわかりませんし無理にCでやる意味はよく分かりません。 (実際入門書でも見かけないし必要な場面はどこでしょうか?笑)
また他の方法とあればぜひ教えてください。