InitializeCriticalSectionAndSpinCount 函式 (synchapi.h)

初始化重要區段物件,並設定重要區段的微調計數。 當線程嘗試取得鎖定的重要區段時,線程會 微調:它會進入迴圈來逐一查看微調計數時間,檢查是否釋放鎖定。 如果在迴圈完成之前未釋放鎖定,線程就會進入睡眠狀態,等待鎖定釋放。

語法

BOOL InitializeCriticalSectionAndSpinCount(
  [out] LPCRITICAL_SECTION lpCriticalSection,
  [in]  DWORD              dwSpinCount
);

參數

[out] lpCriticalSection

重要區段物件的指標。

[in] dwSpinCount

重要區段物件的微調計數。 在單一處理器系統上,會忽略微調計數,而關鍵區段微調計數會設定為 0 (零) 。 在多處理器系統上,如果重大區段無法使用,呼叫線程會在與重要區段相關聯的旗號上執行等候作業之前,先微調 dwSpinCount 時間。 如果關鍵區段在微調作業期間變成可用狀態,則呼叫執行緒會避免等候作業。

傳回值

此函式一律會成功,並傳回非零值。

Windows Server 2003 和 Windows XP: 如果函式成功,則傳回值為非零。 如果函式失敗,則傳回值為零 0。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。 從 Windows Vista 開始, InitializeCriticalSectionAndSpinCount 函式一律會成功,即使在記憶體不足的情況下也是如此。

備註

單一進程的線程可以使用重要區段物件進行相互排除同步處理。 線程取得重要區段擁有權的順序並不保證。 不過,系統對所有線程都公平。

此程式負責配置重要區段物件所使用的記憶體,其方式是宣告類型 為 CRITICAL_SECTION的變數。 使用重要區段之前,進程的某些線程必須初始化 物件。 您接著可以呼叫 SetCriticalSectionSpinCount 函式來修改微調計數。

初始化重要區段對象之後,進程的線程可以在 EnterCriticalSection、TryEnterCriticalSectionLeaveCriticalSection 函式中指定物件,以提供共用資源的互斥存取權。 如需不同進程線程之間的類似同步處理,請使用 mutex 物件。

無法移動或複製重要區段物件。 此程式也不得修改物件,但必須將它視為邏輯不透明。 僅使用重要區段函式來管理重要區段物件。 當您完成使用關鍵區段時,請呼叫 DeleteCriticalSection 函式。

必須先刪除重要區段物件,才能重新初始化。 初始化已初始化的重要區段會導致未定義的行為。

微調計數對於短持續時間的重要區段很有用,這些區段可能會經歷高階競爭。 請考慮最糟的情況,其中 SMP 系統上的應用程式有兩個或三個線程會持續配置和釋放堆積中的記憶體。 應用程式會使用重要區段串行化堆積。 在最差案例中,重大區段的競爭是常數,而且每個線程都會對 WaitForSingleObject 函式進行大量處理呼叫。 不過,如果微調計數已正確設定,則呼叫線程不會在發生爭用時立即呼叫 WaitForSingleObject 。 相反地,呼叫線程可以在微調作業期間釋放時取得重要區段的擁有權。

您可以針對短期間的重要區段選擇小型微調計數,大幅改善效能。 例如,堆積管理員會針對每個堆積關鍵區段使用大約 4,000 個微調計數。

若要編譯使用此函式的應用程式,請將_WIN32_WINNT0x0403定義為 或更新版本。 如需詳細資訊,請參閱 使用 Windows 標頭

範例

如需使用 InitializeCriticalSectionAndSpinCount 的範例,請參閱 使用重要區段物件

規格需求

   
最低支援的用戶端 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

另請參閱

重要區段物件

DeleteCriticalSection

InitializeCriticalSection

InitializeCriticalSectionEx

SetCriticalSectionSpinCount

同步處理函式

WaitForSingleObject

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