スレッドセーフの実現手法
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/09/26 10:11 UTC 版)
「スレッドセーフ」の記事における「スレッドセーフの実現手法」の解説
スレッドセーフを実現する方法として以下のようなものがある。 リエントラント リエントラント化することでスレッドセーフを実現できるが、広域変数などを使った状態情報のセーブができない。 相互排他 共有データへのアクセスを「逐次化」することでスレッドセーフを実現する。ただし、複数の共有データにアクセスする際には十分に注意しなければならない(排他制御参照)。 スレッドローカルデータ 例えばスレッドの識別子(番号)をキーとして広域変数をスレッド毎に持たせることでサブルーチンを超えた範囲で変数を保持できるようにする。各変数にアクセスするサブルーチン自体はリエントラントではないが、特定のスレッドだけが特定の広域変数にアクセスすることが保証できれば、スレッドセーフとなる。 アトミック操作 共有データを何らかのアトミックな操作でアクセスすることで他のスレッドから同時アクセスされないことを保証する。これは一般に特別な命令を必要とするが、そのようなハードウェア的な支援を必要としない純粋なソフトウェア的な解としてランポートのパン屋のアルゴリズムのように、ライブラリがそのような機能をサポートしている場合がある。アトミック操作は多くの排他機構の基盤となっている。 一般的にはこれらの手法に以下の手法を結合して使用する。 共有データのスレッド固有のコピーを使用し、そのコピーの値で共有データをアトミックにアップデートする。このようにすることでコードの大部分は並行して実行可能となり、必要最小限の部分だけがシリアライズされる。
※この「スレッドセーフの実現手法」の解説は、「スレッドセーフ」の解説の一部です。
「スレッドセーフの実現手法」を含む「スレッドセーフ」の記事については、「スレッドセーフ」の概要を参照ください。
- スレッドセーフの実現手法のページへのリンク