クリティカル セクションを使用する
スレッドの調整:インデックス への移動
オブジェクトに組み込みのロック機能がない場合は,クリティカルセクションを使用できます。クリティカルセクションは,一度に 1 つのスレッドだけが入れるゲートのような役割を果たします。クリティカルセクションを使用するには,System.SyncObjs.TCriticalSection のグローバルインスタンスを作成します。System.SyncObjs.TCriticalSection には,Acquire(ほかのスレッドがセクションを実行するのを防ぐ)と Release(ブロックを取り除く)の 2 つのメソッドがあります。
各クリティカルセクションは,保護する対象のグローバルメモリと関連付けられています。それらのグローバルメモリにアクセスする各スレッドは,最初に Acquire メソッドを使用して,ほかのスレッドがそれを使用していないことを確認する必要があります。確認が終了すると,スレッドは Release メソッドを呼び出して,ほかのスレッドが Acquire を呼び出してグローバルメモリにアクセスできるようにします。
警告: クリティカルセクションが機能するのは,すべてのスレッドが,クリティカルセクションを使用してそれに関連付けられたグローバルメモリにアクセスする場合だけです。クリティカルセクションを無視して,Acquire を呼び出さずにグローバルメモリにアクセスするスレッドがある場合は,同時アクセスの問題が発生します。
たとえば,アプリケーションがグローバルなクリティカルセクション変数 LockXY を持ち,グローバル変数 X および Y へのアクセスを遮断する場合を考えます。X または Y を使用するスレッドはすべて,次のようにクリティカルセクションへの呼び出しで囲まなければなりません。
LockXY.Acquire; { ほかのスレッドをロックアウトする }
try
Y := sin(X);
finally
LockXY.Release;
end;