UNIX上でのC++ソフトウェア設計の定石 (6) -- 続き
鉄則6: マルチスレッドプログラミングの「常識」を守ろう
説明: (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を書くのは難しい" を参照してください。
→続き