使用重要區段物件

下列範例示範線程如何初始化、輸入和釋放 重要區段,。 它會使用 InitializeCriticalSectionAndSpinCountEnterCriticalSectionLeaveCriticalSectionDeleteCriticalSection 函式。

Warning

僵局風險: 若執行緒必須取得多個關鍵區段,務必以一致且有文件記錄的順序在所有執行緒中取得。 不同執行緒以不同順序取得鎖,是造成死鎖最常見的原因。 另外要注意, EnterCriticalSection 會無限期封鎖——使用 TryEnterCriticalSection 進行非阻塞的取得嘗試,若需要限時解鎖,則實作有限制的重試迴圈與截止時間。

Note

現代 C++ 替代方案: 對於新程式碼,可以考慮使用 std::mutexstd::lock_guardstd::scoped_lock (C++17),這些工具提供基於 RAII 的鎖管理,即使拋出例外也能確保釋放。 對於以讀取為主的工作負載,可以考慮Slim Reader/Writer(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;
}