InitializeCriticalSectionEx 函式 (synchapi.h)

使用微調計數和選擇性旗標,初始化重要區段物件。

語法

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

參數

[out] lpCriticalSection

重要區段物件的指標。

[in] dwSpinCount

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

[in] Flags

此參數可以是 0 或下列值。

意義
CRITICAL_SECTION_NO_DEBUG_INFO 系統會建立重要區段,而不需偵錯資訊。

傳回值

如果函式成功,則傳回非零的值。

如果函式失敗,傳回值為零, (0) 。 若要取得擴充的錯誤資訊,請呼叫 GetLastError

備註

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

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

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

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

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

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

您可以選擇簡短持續時間關鍵區段的小微調計數,大幅改善效能。 堆積管理員會針對其每個堆積重要區段使用大約 4000 的微調計數。 這在幾乎所有最差案例中都提供絕佳的效能和延展性。

規格需求

需求
最低支援的用戶端 Windows Vista [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2008 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 synchapi.h (包括 Windows 7 上的 Windows.h、Windows Server 2008 Windows Server 2008 R2)
程式庫 Kernel32.lib
DLL Kernel32.dll

另請參閱

Critical Section 物件

DeleteCriticalSection

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