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

スレッドセーフな関数を、

  1. 局所的静的変数(関数内のstatic変数)や非局所的静的変数(大域変数)の操作をしない。かつ、他の非スレッドセーフな関数を呼んでいない
  2. そういう変数の操作をするが、その部分をmutexなどで同期化し、複数のスレッドが同時に操作しないように制限している

と定義しましたが、

  • 前者を特に、リエントラント(reentrant)な関数と呼んで区別するケース
  • 逆に、後者を特に"Serializable"とか(MT-Safeでなく単に)"Safe"な関数と呼んで区別するケース

もあります。Solarisのmanだと、後者の方式で区別していますね。マルチスレッドのプログラムから安全に呼べるなら"Safe"と呼び、さらにその関数の処理を複数スレッドで並列に行える(concurrencyがある)なら"MT-Safe"と呼んでいるようです


まぁ、ちょっと細かいので、シビアに実行速度を求められる環境でコードを書いているのでなければ単に「スレッドセーフかどうか」を意識するだけで良いのではないでしょうか。