執行緒共用
有許多應用程式會建立執行緒,這些執行緒花費大量時間處於睡眠狀態,等待事件發生。 其他執行緒可能只會進入睡眠狀態,以便定期喚醒以輪詢變更或更新狀態資訊。 執行緒共用 可讓您藉由為應用程式提供系統所管理的背景工作執行緒集區,以更有效率地使用執行緒。 至少一個執行緒會監視排入執行緒集區之所有等候作業的狀態。 等候作業完成時,執行緒集區中的背景工作執行緒會執行對應的回呼函式。
本主題描述原始執行緒集區 API。 Windows Vista 中引進的執行緒集區 API 較簡單、更可靠、效能更佳,並為開發人員提供更多彈性。 如需目前線程集區 API 的資訊,請參閱 執行緒集區。
您也可以將與執行緒集區等候作業無關的工作專案排入佇列。 若要要求執行緒集區中的執行緒工作專案,請呼叫 QueueUserWorkItem 函式。 此函式會採用參數給從執行緒集區選取的執行緒所呼叫的函式。 在工作專案已排入佇列之後,就無法取消工作專案。
計時器佇列計時器和已註冊的等候作業也會使用執行緒集區。 其回呼函式會排入執行緒集區。 您也可以使用 BindIoCompletionCallback 函式來張貼非同步 I/O 作業。 完成 I/O 時,回呼是由執行緒集區執行緒執行。
當您第一次呼叫 QueueUserWorkItem 或 BindIoCompletionCallback時,或計時器佇列計時器或已註冊的等候作業佇列回呼函式時,就會建立執行緒集區。 根據預設,可以線上程集區中建立的執行緒數目約為 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 選項) 排入持續性背景工作執行緒 (。
相關主題