Share via


執行緒共用

有許多應用程式會建立執行緒,這些執行緒花費大量時間處於睡眠狀態,等待事件發生。 其他執行緒可能只會進入睡眠狀態,以便定期喚醒以輪詢變更或更新狀態資訊。 執行緒共用 可讓您藉由為應用程式提供系統所管理的背景工作執行緒集區,以更有效率地使用執行緒。 至少一個執行緒會監視排入執行緒集區之所有等候作業的狀態。 等候作業完成時,執行緒集區中的背景工作執行緒會執行對應的回呼函式。

本主題描述原始執行緒集區 API。 Windows Vista 中引進的執行緒集區 API 較簡單、更可靠、效能更佳,並為開發人員提供更多彈性。 如需目前線程集區 API 的資訊,請參閱 執行緒集區

您也可以將與執行緒集區等候作業無關的工作專案排入佇列。 若要要求執行緒集區中的執行緒工作專案,請呼叫 QueueUserWorkItem 函式。 此函式會採用參數給從執行緒集區選取的執行緒所呼叫的函式。 在工作專案已排入佇列之後,就無法取消工作專案。

計時器佇列計時器和已註冊的等候作業也會使用執行緒集區。 其回呼函式會排入執行緒集區。 您也可以使用 BindIoCompletionCallback 函式來張貼非同步 I/O 作業。 完成 I/O 時,回呼是由執行緒集區執行緒執行。

當您第一次呼叫 QueueUserWorkItemBindIoCompletionCallback時,或計時器佇列計時器或已註冊的等候作業佇列回呼函式時,就會建立執行緒集區。 根據預設,可以線上程集區中建立的執行緒數目約為 500。 每個執行緒都會使用預設堆疊大小,並以預設優先順序執行。

執行緒集區中有兩種類型的背景工作執行緒:I/O 和非 I/O。 I/O 背景工作執行緒是等候處於可警示等候狀態的執行緒。 工作專案會排入佇列至 I/O 背景工作執行緒,做為非同步程序呼叫, (APC) 。 如果工作專案應在等候處於可警示狀態的執行緒中執行,您應該將工作專案排入 I/O 背景工作執行緒。

非 I/O 背景工作執行緒會在 I/O完成埠上等候。 使用非 I/O 背景工作執行緒比使用 I/O 背景工作執行緒更有效率。 因此,您應該盡可能使用非 I/O 背景工作執行緒。 如果有擱置的非同步 I/O 要求,I/O 和非 I/O 背景工作執行緒都不會結束。 這兩種類型的執行緒都可以由起始非同步 I/O 完成要求的工作專案使用。 不過,如果非 I/O 背景工作執行緒可能需要很長的時間才能完成,請避免在非 I/O 背景工作執行緒中張貼非同步 I/O 完成要求。

若要使用執行緒共用,工作專案和它們呼叫的所有函式都必須是安全線程集區。 安全函式不會假設執行它的執行緒是專用或持續性執行緒。 一般而言,您應該避免使用 執行緒本機儲存體 ,或進行需要永續性執行緒的非同步呼叫,例如 RegNotifyChangeKeyValue 函式。 不過,這類函式可以在應用程式) 建立的專用 (執行緒上呼叫,或使用 QueueUserWorkItem 搭配 WT_EXECUTEINPERSISTENTTHREAD 選項) 排入持續性背景工作執行緒 (。

可警示 I/O

非同步程序呼叫

I/O 完成埠

執行緒集區