ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
マルチスレッド環境で、複数のスレッドから呼ばれても問題が生じない作りになっていること。
スレッドセーフでないものとしては、C言語のstrtok()が有名。マルチスレッド処理でこの関数が使われ、発見しにくいバグを混入させる事件が今も度々発生している(Androidなどにも少なからず存在する)。
従って、スレッドセーフではない関数は絶対に使っていはいけない。
スレッドセーフではないCライブラリ関数として、次のようなものがある。置き換え先となる再入可能関数を併記する。
これら関数は、静的データへのポインターを返すので、スレッドセーフではない。
→ asctime_r()、ctime_r()、gmtime_r()、localtime_r() SUS v2以降で対応
内部でstatic変数またはグローバル変数に状態を保持しているため、スレッドセーフではない。
→ strtok_r() POSIX.1-2001以降で対応
保護されていないグローバル変数を使用しているため、スレッドセーフではない。
環境に応じた関数を使用する。
保護されていないグローバル変数を使用しているため、スレッドセーフではない。
→ rand_r() POSIX.1-2001、ただし POSIX.1-2009 では将来的に廃止予定としている。後述の関数を使用するのが良い
→ random()、srandom()、initstate()、setstate() 4.3BSD、POSIX.1-2001
内部でstatic変数またはグローバル変数に状態を保持しているため、スレッドセーフではない。
→ lgamma_r()、lgammaf_r()、lgammal_r() 非標準の拡張
いずれも制限付きのスレッドセーフ関数である。
各関数の最後のパラメーター mbstate_t * をNULLにした場合、内部でstatic変数またはグローバル変数に状態を保持するため、スレッドセーフではなくなる。
→ 必ず mbstate_t * を設定する
ロケールは、システム全体を通してグローバルであり、ロックでの保護もない。複数のスレッドから設定や参照などをすると、データが破損する可能性や、予期せぬ結果となる場合がある。
→ 実装によっては、再入可能バージョンの独自関数を提供していることがある
この関数は、静的データへのポインターを返すので、スレッドセーフではない。
→ 実装によっては、再入可能バージョンの独自関数を提供していることがある
コメントなどを投稿するフォームは、日本語対応時のみ表示されます