IThreadProxy 結構
執行緒的抽象概念。 視您所建立之排程器的 SchedulerType
原則機碼而定,資源管理員會授與您支援一般 Win32 執行緒或可使用者模式排程 (UMS) 執行緒的執行緒 Proxy。 安裝 Windows 7 (含以上) 版本的 64 位元作業系統支援 UMS 執行緒。
語法
struct IThreadProxy;
成員
公用方法
名稱 | 描述 |
---|---|
IThreadProxy::GetId | 傳回線程 Proxy 的唯一標識碼。 |
IThreadProxy::SwitchOut | 解除基礎虛擬處理器根內容的關聯。 |
IThreadProxy::SwitchTo | 執行合作式內容切換,從目前執行的內容切換為不同的內容。 |
IThreadProxy::YieldToSystem | 造成呼叫執行緒執行目前處理器上已就緒可執行的其他執行緒。 操作系統會選取要執行的下一個線程。 |
備註
線程 Proxy 會結合介面所 IExecutionContext
表示的執行內容,做為分派工作的方法。
繼承階層架構
IThreadProxy
需求
標頭: concrtrm.h
命名空間: concurrency
IThreadProxy::GetId 方法
傳回線程 Proxy 的唯一標識碼。
virtual unsigned int GetId() const = 0;
傳回值
唯一的整數標識碼。
IThreadProxy::SwitchOut 方法
解除基礎虛擬處理器根內容的關聯。
virtual void SwitchOut(SwitchingProxyState switchState = Blocking) = 0;
參數
switchState
指出執行參數的線程 Proxy 狀態。 參數的類型為 SwitchingProxyState
。
備註
如果因故需要將內容與其執行所在的虛擬處理器根解除關聯,請使用 SwitchOut
。 根據您傳遞給 switchState
參數的值,以及它是否在虛擬處理器根上執行而定,呼叫會立即傳回或是封鎖與內容相關聯的執行緒 Proxy。 在將參數設定為 SwitchOut
的情況下呼叫 Idle
是錯誤的做法。 這樣做會導致 invalid_argument 例外狀況。
無論是因為資源管理員的指示,或是您要求暫時過度訂閱虛擬處理器根,但已經不再需要這樣做,只要您想要減少排程器擁有的虛擬處理器根數目,SwitchOut
都會很有用。 在此情況下,您應該在虛擬處理器根目錄叫用 IVirtualProcessorRoot::Remove 方法,然後再呼叫 SwitchOut
,並將 參數switchState
設定為 Blocking
。 這樣將會封鎖執行緒 Proxy,而且它會在排程器中有不同的虛擬處理器根可用於執行時繼續執行。 藉由呼叫 SwitchTo
函式切換至此線程 Proxy 的執行內容,即可繼續封鎖線程 Proxy。 您也可以使用線程 Proxy 的相關內容來啟動虛擬處理器根目錄,以繼續線程 Proxy。 如需如何執行這項操作的詳細資訊,請參閱 IVirtualProcessorRoot::Activate。
當您想要重新初始化虛擬處理器,讓它能夠在未來發生封鎖執行緒 Proxy,或是暫時將它卸離執行所在的虛擬處理器根以及對其分派工作的排程器時可以啟動,您也可以使用 SwitchOut
。 如果您想要封鎖執行緒 Proxy,請使用 SwitchOut
,並將 switchState
參數設定為 Blocking
。 之後可以使用 SwitchTo
或 IVirtualProcessorRoot::Activate
讓它繼續執行,如上面所述。 當您想要暫時將這個執行緒 Proxy 卸離執行所在的虛擬處理器根,以及與虛擬處理器相關聯的排程器,請使用 SwitchOut
並將參數設定為 Nesting
。 若呼叫 SwitchOut
並將 switchState
參數設定為 Nesting
時,它正在虛擬處理器根上執行,則會造成根重新初始化,而且目前執行緒 Proxy 會繼續執行,不需要根。 線程 Proxy 會被視為已離開排程器,直到它在稍後的時間點呼叫 Blocking
IThreadProxy::SwitchOut 方法為止。 第二次呼叫 SwitchOut
並將參數設定為 Blocking
時,該呼叫會將內容返回已封鎖狀態,以便在卸離的排程器中透過 SwitchTo
或 IVirtualProcessorRoot::Activate
繼續執行。 由於它並未在虛擬處理器根上執行,因此不會發生重新初始化。
已重新初始化的虛擬處理器根與資源管理員授與排程器的全新虛擬處理器根並無不同。 您可以在執行內容中使用 IVirtualProcessorRoot::Activate
啟用它,這樣就可以用它來執行。
SwitchOut
必須在表示目前執行中線程的介面上 IThreadProxy
呼叫,否則結果未定義。
在隨附於 Visual Studio 2010 的程式庫和標頭中,這個方法不會使用參數,也不會重新初始化虛擬處理器根。 若要保留舊有行為,可以提供預設參數值 Blocking
。
IThreadProxy::SwitchTo 方法
執行合作式內容切換,從目前執行的內容切換為不同的內容。
virtual void SwitchTo(
_Inout_ IExecutionContext* pContext,
SwitchingProxyState switchState) = 0;
參數
pContext
要合作切換至的執行內容。
switchState
指出執行參數的線程 Proxy 狀態。 參數的類型為 SwitchingProxyState
。
備註
使用這個方法,從第一個執行內容的 IExecutionContext::D ispatch 方法切換至另一個執行內容。 如果執行內容尚未與線程 Proxy 相關聯,則方法會將執行內容 pContext
與線程 Proxy 產生關聯。 目前線程 Proxy 的擁有權取決於您為 switchState
自變數指定的值。
當您想要將目前執行的線程 Proxy 傳回給 Resource Manager 時,請使用 值 Idle
。 呼叫 SwitchTo
時,將參數 switchState
設定為 Idle
,會導致執行內容 pContext
開始在基礎執行資源上執行。 此線程 Proxy 的擁有權會傳送至 Resource Manager,而且您應該會在傳回之後SwitchTo
不久從執行內容的 Dispatch
方法傳回,才能完成傳輸。 線程 Proxy 正在分派的執行內容會與線程 Proxy 解除關聯,而排程器可以自由重複使用或終結它,因為它看起來合適。
當您想要此線程 Proxy 進入封鎖狀態時,請使用 值 Blocking
。 將 參數switchState
設為的Blocking
呼叫SwitchTo
會導致執行內容pContext
開始執行,並封鎖目前的線程 Proxy,直到繼續為止。 當線程 Proxy 處於狀態時,排程器會保留線程 Proxy Blocking
的擁有權。 藉由呼叫 SwitchTo
函式切換至此線程 Proxy 的執行內容,即可繼續封鎖線程 Proxy。 您也可以使用線程 Proxy 的相關內容來啟動虛擬處理器根目錄,以繼續線程 Proxy。 如需如何執行這項操作的詳細資訊,請參閱 IVirtualProcessorRoot::Activate。
當您想要暫時中斷此線程 Proxy 與其執行所在的虛擬處理器根目錄中斷連結,以及其分派工作的排程器時,請使用 值 Nesting
。 將 參數switchState
設為的Nesting
呼叫SwitchTo
會導致執行內容pContext
開始執行,而目前的線程 Proxy 也會繼續執行,而不需要虛擬處理器根目錄。 線程 Proxy 會被視為離開排程器,直到稍後的時間點呼叫 IThreadProxy::SwitchOut 方法為止。 IThreadProxy::SwitchOut
方法可以封鎖線程 Proxy,直到虛擬處理器根目錄可供重新排程為止。
SwitchTo
必須在表示目前執行中線程的介面上 IThreadProxy
呼叫,否則結果未定義。 如果 參數pContext
設定為 NULL
,則函式會invalid_argument
擲回 。
IThreadProxy::YieldToSystem 方法
造成呼叫執行緒執行目前處理器上已就緒可執行的其他執行緒。 操作系統會選取要執行的下一個線程。
virtual void YieldToSystem() = 0;
備註
由一般 Windows 線程支持的線程 Proxy 呼叫時, YieldToSystem
行為與 Windows 函式 SwitchToThread
完全相同。 不過,從使用者模式可分流 (UMS) 線程呼叫時,函 SwitchToThread
式會將挑選下一個線程的工作委派給使用者模式排程器,而不是操作系統。 若要達到切換至系統中不同就緒線程所需的效果,請使用 YieldToSystem
。
YieldToSystem
必須在表示目前執行中線程的介面上 IThreadProxy
呼叫,否則結果未定義。
另請參閱
concurrency 命名空間
IExecutionContext 結構
IScheduler 結構
IVirtualProcessorRoot 結構