クリティカル セクション オブジェクトの使用

次の例は、スレッドがクリティカル セクション を初期化、入力、および解放する方法を示しています。 InitializeCriticalSectionAndSpinCountEnterCriticalSectionLeaveCriticalSection、および DeleteCriticalSection 関数が使用されます。

Warning

デッドロック リスク: スレッドが複数の重要なセクションを取得する必要がある場合は、常にすべてのスレッドで一貫した文書化された順序で取得します。 さまざまなスレッドから異なる順序でロックを取得することが、デッドロックの最も一般的な原因です。 また、 EnterCriticalSection は無期限にブロックされることに注意してください。非ブロッキングの取得の試行には TryEnterCriticalSection を使用し、期限付きのロック取得が必要な場合は期限付き再試行ループを実装します。

Note

最新の C++ の代替手段:新しいコードの場合は、std::mutexまたはstd::lock_guard (C++17) でstd::scoped_lockを使用することを検討してください。これにより、例外がスローされた場合でも解放を保証する RAII ベースのロック管理が提供されます。 読み取り負荷の高いワークロードの場合は、 スリム リーダー/ライター (SRW) ロック または std::shared_mutexを検討してください。

// Global variable
CRITICAL_SECTION CriticalSection; 

int main( void )
{
    ...

    // Initialize the critical section one time only.
    if (!InitializeCriticalSectionAndSpinCount(&CriticalSection, 
        0x00000400) ) 
        return;
    ...

    // Release resources used by the critical section object.
    DeleteCriticalSection(&CriticalSection);
}

DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
    ...

    // Request ownership of the critical section.
    EnterCriticalSection(&CriticalSection); 

    // Access the shared resource.

    // Release ownership of the critical section.
    LeaveCriticalSection(&CriticalSection);

    ...
return 1;
}