線程共用
有許多應用程式會建立線程,這些線程會花費大量時間進入睡眠狀態,等待事件發生。 其他線程可能會進入睡眠狀態,並僅在需定期喚醒以查詢變更或更新狀態資訊時進行操作。 線程池 可讓您更有效率地使用線程,因為它為您的應用程式提供了一個由系統管理的工作線程池。 至少有一個執行緒會監視排入執行緒集區之所有等候作業的狀態。 等候作業完成時,來自線程集區的背景工作線程會執行對應的回呼函式。
本主題描述原始線程集區 API。 Windows Vista 中引進的線程集區 API 更簡單、更可靠、效能更佳,併為開發人員提供更多彈性。 如需目前線程集區 API 的資訊,請參閱 線程集區。
您也可以將與等候操作無關的工作專案排入佇列,提交到執行緒集區。 若要要求線程集區中的線程處理工作專案,請呼叫 QueueUserWorkItem 函式 。 此函式會接收一個參數,該參數是提供給從線程池選取的線程所要呼叫的函式。 在工作專案已排入佇列之後,無法取消工作專案。
定時器佇列定時器 和 已註冊的等候作業, 也會使用線程集區。 其回呼函式會排入線程集區。 您也可以使用 BindIoCompletionCallback 函式來發送異步 I/O 作業。 完成 I/O 後,回呼會由執行緒池中的執行緒執行。
第一次 呼叫 queueUserWorkItem 或 BindIoCompletionCallback時,或定時器佇列定時器或已註冊的等候作業佇列回呼函式時,就會建立線程集區。 根據預設,可以在線程集區中建立的線程數目約為 500。 每個線程都會使用預設堆疊大小,並以預設優先順序執行。
線程集區中有兩種類型的工作線程: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 選項)。
相關主題