地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

C言語でシングルトンを実装

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でやる意味はよく分かりません。 (実際入門書でも見かけないし必要な場面はどこでしょうか?笑)

また他の方法とあればぜひ教えてください。