下列範例示範線程如何初始化、輸入和釋放 重要區段,。 它會使用 InitializeCriticalSectionAndSpinCount、EnterCriticalSection、LeaveCriticalSection和 DeleteCriticalSection 函式。
Warning
僵局風險: 若執行緒必須取得多個關鍵區段,務必以一致且有文件記錄的順序在所有執行緒中取得。 不同執行緒以不同順序取得鎖,是造成死鎖最常見的原因。 另外要注意, EnterCriticalSection 會無限期封鎖——使用 TryEnterCriticalSection 進行非阻塞的取得嘗試,若需要限時解鎖,則實作有限制的重試迴圈與截止時間。
Note
現代 C++ 替代方案: 對於新程式碼,可以考慮使用 std::mutex 或 std::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;
}