スレッドセーフ【thread-safe】thread safety
概要

一つのプロセスの中で複数の処理の流れ(スレッド)を並行して動かす仕組みを「マルチスレッド」(multithreading)という。各スレッドは同じメモリ空間を共有するため、複数のスレッドが同じデータや資源に同時にアクセスすると、処理の実行順序によって結果が変化することがある。このような状況は「レースコンディション」(競合状態)と呼ばれ、スレッドセーフでない実装における不具合の典型的な原因となる。
スレッドセーフ性が問われるのは、主にスレッド間で共有される資源を扱う場合である。静的変数やグローバル変数、ヒープ領域上のオブジェクト、ファイルやデータベースなどへのアクセスを含む処理は、そのままではスレッドセーフでないことが多い。一方、関数の中でローカル変数だけを使用する場合は、各スレッドが独立したスタック領域を持つため、原則としてスレッドセーフである。
スレッドセーフ性を確保する手段として、「ミューテックス」(mutex)や「セマフォ」(semaphore)といった排他制御(ロック)機構がある。あるスレッドが共有資源にアクセスしている間は他のスレッドを待機させることで競合を防ぐ。変更操作が不可能な「不変オブジェクト」(immutable object)を積極的に用いて、そもそも書き換えが発生しない設計にする方法や、スレッドローカルストレージでスレッドごとに独立したデータ領域を持たせる方法もある。また、データの読み書きを分割不可能な単一の操作として扱う「アトミック操作」を用いることで、ロックなしに安全性と性能を両立させる手法も利用されている。
プログラミング言語や標準ライブラリによっては、スレッドセーフな実装を明示的に提供しているものもある。例えばJavaのjava.util.concurrentパッケージや、Pythonのqueue.Queueクラスがその例であり、ドキュメントでスレッドセーフであることが保証されている場合はそのまま利用できる。逆に保証がない関数やクラスをマルチスレッド環境で使用する際は、呼び出し側で適切な排他制御を行う必要がある。