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的變數。 使用重要區段之前,進程的某些線程必須呼叫 InitializeCriticalSectionInitializeCriticalSectionAndSpinCount 來初始化物件。

若要啟用共享資源的互斥存取,每個線程都會呼叫 EnterCriticalSectionTryEnterCriticalSection 函式,先要求重要區段的擁有權,再執行存取受保護資源的任何程式代碼區段。 差別在於 ,不論 TryEnterCriticalSection 是否取得重要區段的擁有權,TryEnterCriticalSection 都會立即傳回,而 EnterCriticalSection 會封鎖直到線程可以取得重要區段的擁有權為止。 當它完成執行受保護的程式代碼時,線程會使用 LeaveCriticalSection 函式來放棄擁有權,讓另一個線程成為擁有者並存取受保護的資源。 對於等候線程取得重要區段擁有權的順序並不保證。

線程擁有重要區段的擁有權之後,它可以對 EnterCriticalSectionTryEnterCriticalSection 進行額外的呼叫,而不會封鎖其執行。 這可防止線程在等候它已擁有的重要區段時自行死結。 每次 EnterCriticalSectionTryEnterCriticalSection 成功時,線程都會進入關鍵區段。 每次進入關鍵區段時,線程都必須呼叫 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

另請參閱

Critical Section 物件

DeleteCriticalSection

InitializeCriticalSection

InitializeCriticalSectionAndSpinCount

LeaveCriticalSection

同步處理函式

TryEnterCriticalSection

VBS 記憶體保護區中可用的 Vertdll API