UNIX上でのC++ソフトウェア設計の定石 (6) -- おまけ
スレッドセーフな関数を、
- 局所的静的変数(関数内のstatic変数)や非局所的静的変数(大域変数)の操作をしない。かつ、他の非スレッドセーフな関数を呼んでいない
- そういう変数の操作をするが、その部分をmutexなどで同期化し、複数のスレッドが同時に操作しないように制限している
と定義しましたが、
- 前者を特に、リエントラント(reentrant)な関数と呼んで区別するケース
- 逆に、後者を特に"Serializable"とか(MT-Safeでなく単に)"Safe"な関数と呼んで区別するケース
もあります。Solarisのmanだと、後者の方式で区別していますね。マルチスレッドのプログラムから安全に呼べるなら"Safe"と呼び、さらにその関数の処理を複数スレッドで並列に行える(concurrencyがある)なら"MT-Safe"と呼んでいるようです。
まぁ、ちょっと細かいので、シビアに実行速度を求められる環境でコードを書いているのでなければ単に「スレッドセーフかどうか」を意識するだけで良いのではないでしょうか。