UNIX上でのC++ソフトウェア設計の定石 (6) -- 続き

鉄則6: マルチスレッドプログラミングの「常識」を守ろう

  1. POSIXの標準関数のうち、非スレッドセーフであるものの一覧を把握し、使わないようにせよ
  2. 自作の関数はスレッドセーフにせよ
    • 共有変数はロックして参照・更新せよ
    • C++を使っているなら、関数を同期化する方法に注意せよ

説明: (2) 自作の関数はスレッドセーフにせよ


マルチスレッドのアプリケーションを書くときは、複数のスレッドで共有する変数はロックしてから参照・更新するようにしましょう。複数スレッドで共有する変数として主なものは、大域変数と関数内のstatic変数が挙げられます。また、short型やint型の変数であってもロックして更新した方が安全な場合が多いです。


※ 詳細は id:yupo5656:20040618 "[C++] マルチスレッドと共有変数" を参照してください。


また、C++を使っている場合は関数の同期化方法に注意です。一般的に言って次はNGです。Mutexを関数内static変数として宣言するのはやめましょう

int incr_counter(void) {
  static Mutex m;  // ここがダメ
  m.Lock();

  static int counter = 0;
  int ret = ++counter;

  m.Unlock();
  return ret;
}

かわりに、

Mutex m;

int incr_counter(void) {
  m.Lock();
  // ...

と、Mutexをグローバル変数に追いやるほうが良い(すこしはマシ)です。


※ 詳細は id:yupo5656:20040713 "[C++] C++でsynchronized methodを書くのは難しい" を参照してください。


続き