スレッドセーフとは
スレッドセーフ(Thread-safe)とは、マルチスレッド環境において、プログラムを複数のスレッドで並行に実行しても、問題が生じない作りであることを意味します。
※マルチスレッドとは、複数の処理を並行に動作させること。
スポンサーリンク
下記の図の通り、スレッドセーフのプログラムは、同時に呼び出されても問題が発生しないように設計されています。そのため呼び出し元は、マルチスレッド環境でもスレッドセーフのプログラムを安心して使用する事ができます。
逆に下記の図のように、スレッドセーフではないプログラムは、同時に呼び出されると問題が発生する危険性があります。
そのためマルチスレッド環境では、呼び出し元で順番にスレッドセーフではないプログラムを呼び出すように制御する等の工夫が必要です。
スレッドセーフをプログラムではなく、交通で例えると
- スレッドセーフ:信号機が設置されている道路
- スレッドセーフではない:信号機が設置されていない道路
信号機が設置されているため、複数の車が同時に道路を走っても安全です。逆に信号機が設置されていない道路を複数の車が同時に走れば事故は多発する事が想像できます。
共通の資源である道路を使う場合、スレッドセーフを考慮した(信号機を設置)作りになっていないと事故が発生する危険性がある事がわかります。
スポンサーリンク
スレッドセーフの具体例
スレッドセーフについてもう少し具体的な例で説明します。
例えば共有メモリを操作する場合、処理1が共有メモリに書いている途中に、処理2が共有メモリに書こうとすると、想定外のデータになったり、処理1が書いていた内容が失われたりします。
このように複数のスレッドから同時に呼び出された時、処理が競合してしまうのを防ぐのが「スレッドセーフ」です。
スレッドセーフのプログラムは処理が競合しないように基本、以下のような流れになっています。
- 処理1が共有メモリの書き込みを開始する
- 処理2が共有メモリの書き込みを開始するが、処理1が書き込み中なので処理1の書き込みが終わるまで待機する
- 処理1の書き込みが終了
- 処理2が共有メモリの書き込みを開始する
終わりに
スレッドセーフについて図を利用して紹介しました。
マルチスレッド環境で共有の資源を扱う場合、共有な資源にアクセスするプログラムがスレッドセーフになっているかは非常に重要です。
また共有な資源にアクセスするプログラムを作る場合は、スレッドセーフを意識したプログラムを組む必要があります。