ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Binary HacksコミュのHack #36 C++ で Synchronized method を書く

  • mixiチェック
  • このエントリーをはてなブックマークに追加
プラクライマと申します。本書は大変すばらしく実務で大いに役立てております。どうしても分からない記述があるのですが、もしご存じの方がおられましたら教えていただけませんでしょうか。

手に持っているのは初版第一版 (2006年 11月 8日) です。P.128 にタイトルのテクニックについて書かれています。本論とは少しずれるのですが、冒頭 C 言語によるサンプルコードがあります。

void need_to_sync() {
  static pthread_mutex_t  m = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
  pthread_mutex_lock(&m);
    // 何らかの処理
  pthread_mutex_unlock(&m);
}

【質問内容】
glibc の実装はロック用のアトミック操作を行うメモリ領域を pthread_mutex_t の中に内包しています。もし A というスレッドと B というスレッドが need_to_sync() を呼び出した場合、それぞれ別のインスタンスが生成されるので相互排他できないのではないかと思うのですがいかがでしょうか?

【確認したこと】
実際にテストプログラムを作成しても本書記述通りの動作はしませんでした (gcc 3.3.6 / glibc 2.3.4 で確認)

テストで使用したプログラムは以下の通りです。need_to_sync() で排他できるのであれば '.' か '-' のいずかのみ表示されると思うのですが、'.' がしばらく表示された後、'-' が表示されるというのを繰り返します。

void need_to_sync(char c)
{
  pthread_mutex_t lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;

  pthread_mutex_lock(&lock);
  while(1) {
    putchar(c);
  }
  pthread_mutex_unlock(&lock);
}

void *thread_function(void *thdata)
{
char *c = (char *)thdata;

  need_to_sync(*c);

  /* dummy */
  return (void *) NULL;
}

int main (void)
{
  int rtn;
  pthread_t th1, th2;

  rtn = pthread_create(&th1, NULL, thread_function, (void *) ".");
  if (rtn != 0) {
    fprintf(stderr, "pthread_create() - thread#1 failed for %d.", rtn);
    exit(EXIT_FAILURE);
  }
  rtn = pthread_create(&th2, NULL, thread_function, (void *) "-");
  if (rtn != 0) {
    fprintf(stderr, "pthread_create() - thread#2 failed for %d.", rtn);
    exit(EXIT_FAILURE);
  }

  pthread_join(th1, NULL);
  pthread_join(th2, NULL);

  exit(EXIT_SUCCESS);
}


putchar() 内部でもロックしていますが、

pthread_mutex_lock(&lock);
  _IO_acquire_lock (_IO_stdout);
  ......
  _IO_release_lock (_IO_stdout);
pthread_mutex_unlock(&lock);

の順番ですので、pthread_mutex_lock(&lock) が有効であれば '.' か '-' のどちらか一方しか表示されないと思うのです。

よろしくお願いいたします。

コメント(2)

最初のコード例はmutexがstaticで定義されてるのに、実験コードではautoで定義しているから、じゃないでしょうか?
ありがとうございます。おっしゃる通りですね。お恥ずかしいかぎりです。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Binary Hacks 更新情報

Binary Hacksのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング