スレッドセーフ
読み:スレッドセーフ
外語:thread safe

 マルチスレッド環境で、複数のスレッドから呼ばれても問題が生じない作りになっていること。
目次

概要
 スレッドセーフでないと、複数のスレッドから同時に利用された場合にバッファー/オブジェクト等が破壊されるなどし、正常に動作できなくなる。
 Cの標準関数でもスレッドセーフでないものは数多くある。静的データへのポインターを返すものは全てスレッドセーフではなく、関数の戻り値を得てから使用するまでの間に別のスレッドによって結果が上書きされる可能性がある。

特徴

関数
 スレッドセーフでないものとしては、C言語のstrtok()が有名。マルチスレッド処理でこの関数が使われ、発見しにくいバグを混入させる事件が今も度々発生している(Androidなどにも少なからず存在する)。
 従って、スレッドセーフではない関数は絶対に使っていはいけない
 スレッドセーフではないCライブラリ関数として、次のようなものがある。置き換え先となる再入可能関数を併記する。

グローバル変数
 ミューテックスなど適切なロックをせずにグローバル変数を使用した場合、その変数がある特定の読み出し専用用途でない限り、そのコードはスレッドセーフではなくなる。
 なお、グローバル変数に見えるerrnoは実はマクロであり、グローバル変数ではなく各スレッド毎に値を持っている。従って、同じプロセスでもスレッドが異なれば別の変数である。

再検索