EnterCriticalSection 函式 (synchapi.h)
等候指定之重要區段對象的擁有權。 當呼叫線程被授與擁有權時,函式會傳回 。
語法
void EnterCriticalSection(
[in, out] LPCRITICAL_SECTION lpCriticalSection
);
參數
[in, out] lpCriticalSection
重要區段物件的指標。
傳回值
此函式不會傳回值。
如果重大區段上的等候作業逾時,此函式可以引發 EXCEPTION_POSSIBLE_DEADLOCK也稱為 STATUS_POSSIBLE_DEADLOCK。逾時間隔是由下列登錄值所指定: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CriticalSectionTimeout。 請勿處理可能的死結例外狀況;而是偵錯應用程式。
備註
單一進程的線程可以使用重要區段對象進行互斥同步處理。 此進程負責配置重要區段物件所使用的記憶體,其方式是宣告類型 為 CRITICAL_SECTION的變數。 使用重要區段之前,進程的某些線程必須呼叫 InitializeCriticalSection 或 InitializeCriticalSectionAndSpinCount 來初始化物件。
若要啟用共享資源的互斥存取,每個線程都會呼叫 EnterCriticalSection 或 TryEnterCriticalSection 函式,先要求重要區段的擁有權,再執行存取受保護資源的任何程式代碼區段。 差別在於 ,不論 TryEnterCriticalSection 是否取得重要區段的擁有權,TryEnterCriticalSection 都會立即傳回,而 EnterCriticalSection 會封鎖直到線程可以取得重要區段的擁有權為止。 當它完成執行受保護的程式代碼時,線程會使用 LeaveCriticalSection 函式來放棄擁有權,讓另一個線程成為擁有者並存取受保護的資源。 對於等候線程取得重要區段擁有權的順序並不保證。
線程擁有重要區段的擁有權之後,它可以對 EnterCriticalSection 或 TryEnterCriticalSection 進行額外的呼叫,而不會封鎖其執行。 這可防止線程在等候它已擁有的重要區段時自行死結。 每次 EnterCriticalSection 和 TryEnterCriticalSection 成功時,線程都會進入關鍵區段。 每次進入關鍵區段時,線程都必須呼叫 LeaveCriticalSection 一次。
進程的任何線程都可以使用 DeleteCriticalSection 函式來釋放初始化重要區段物件時所配置的系統資源。 呼叫此函式之後,就無法再使用重要區段對象來進行同步處理。
如果線程在具有重要區段的擁有權時終止,則重要區段的狀態為未定義。
如果重要區段仍在擁有時遭到刪除,則等候已刪除之重要區段擁有權的線程狀態為未定義。
當進程結束時,如果 對 EnterCriticalSection 的呼叫會封鎖,則會改為立即終止進程。 這可能會導致不呼叫全域解構函式。
範例
如需使用 EnterCriticalSection 的範例,請參閱 使用 Critical Section 物件。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows XP [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | Windows Server 2003 [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | synchapi.h (包含 Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2) |
程式庫 | Kernel32.lib |
DLL | Kernel32.dll |