<Return[E]><Top>

EnterCriticalSection

Declare Sub Api_EnterCriticalSection Lib "kernel32" Alias "CheckDlgButton" (lpCriticalSection As CRITICAL_SECTION)

Declare Sub EnterCriticalSection Lib "kernel32" Alias "CheckDlgButton" (lpCriticalSection As CRITICAL_SECTION)

指定されたクリティカルセクションオブジェクトの所有権を取得するまで待機する。呼び出し側スレッドが所有権を取得すると、この関数は制御を返す。

パラメータ
lpCriticalSection
    クリティカルセクションオブジェクトへのポインタを指定する。

戻り値
    戻り値はなし。
    メモリ不足の状況で EnterCriticalSection 関数を実行すると、STATUS_INVALID_HANDLE の例外が発生することがある。

解説
    クリティカルセクションオブジェクトを使うと、1 つのプロセスの複数のスレッド間で相互排他の同期を行える。このプロセスはクリティカルセクシ

    ョンオブジェクトが利用するメモリを割り当てる必要があるが、CRITICAL_SECTION 型の 1 個の変数を宣言することにより、この作業を行

    える。クリティカルセクションを使う前に、そのプロセスの 1 つのスレッドで、InitializeCriticalSection または

    InitializeCriticalSectionAndSpinCount 関数を呼び出して、そのオブジェクトを初期化しなければならない。
    共有リソースへの相互排他アクセスを実現するには、各スレッドは、保護対象のリソースにアクセスする任意のコードセクションを実行する前

    に、EnterCriticalSection または TryEnterCriticalSection 関数を呼び出し、クリティカルセクションの所有権を要求する。これら 2 つの関

    数の違いであるが、TryEnterCriticalSection 関数はクリティカルセクションの所有権を取得できたかどうかにかかわりなく即座に制御を返す

    のに対し、EnterCriticalSection 関数はクリティカルセクションの所有権を取得できるまではスレッドの実行をブロックする。スレッドが保護対

    象のリソースにアクセスするコードを実行し終わると、スレッドは LeaveCriticalSection 関数を使って所有権を放棄するので、他のスレッドが

    保護対象のリソースの所有者になり、そのリソースにアクセスできるようになる。各スレッドは、クリティカルセクションに入るたびに

    LeaveCriticalSection 関数を 1 回呼び出さなければならない。各スレッドは、または関数が成功するたびにクリティカルセクションに入る。
    各スレッドはクリティカルセクションの所有権を取得した後は、自らの実行をブロックすることなく、EnterCriticalSection または

    TryEnterCriticalSection 関数を追加で呼び出すことができる。この結果、スレッドが既に自ら所有しているクリティカルセクションを待機しよ

    うとしてデッドロックに陥ることを防止できる。
    1 つのプロセス内の任意のスレッドは、DeleteCriticalSection 関数を使うと、クリティカルセクションオブジェクトを初期化した際に割り当てら

    れたシステムリソースを解放できる。その関数を呼び出した後は、同期の目的でそのクリティカルセクションオブジェクトを使うことはできない。
    クリティカルセクションを所有しているスレッドが、所有権を放棄することなく終了すると、そのクリティカルセクションの状態は未定義になる。
    クリティカルセクションが所有されている状態でそのクリティカルセクションを削除すると、そのクリティカルセクションの所有権を取得するために

    待機していたスレッドの状態は未定義にな。