IExecutionResource 結構
硬體執行緒的抽象概念。
語法
struct IExecutionResource;
成員
公用方法
名稱 | 描述 |
---|---|
IExecutionResource::CurrentSubscriptionLevel | 傳回此執行資源目前與基礎硬體執行緒相關聯的已啟動虛擬處理器根和已訂閱的外部執行緒數目。 |
IExecutionResource::GetExecutionResourceId | 傳回此執行資源所代表之硬體執行緒的唯一識別碼。 |
IExecutionResource::GetNodeId | 傳回這個執行資源所屬之處理器節點的唯一識別碼。 |
IExecutionResource::Remove | 將這個執行資源傳回 Resource Manager。 |
備註
執行資源可以是獨立或與虛擬處理器根目錄相關聯的。 當您應用程式中的執行緒建立執行緒訂用帳戶時,就會建立獨立執行資源。 ISchedulerProxy::SubscribeThread 和 ISchedulerProxy::RequestInitialVirtualProcessors 方法會建立執行緒訂閱,並傳回 IExecutionResource
代表訂用帳戶的介面。 建立執行緒訂用帳戶是通知 Resource Manager,指定執行緒將參與排入排程器的工作佇列,以及虛擬處理器根資源管理員指派給排程器的方法。 Resource Manager 會使用資訊來避免過度訂閱硬體執行緒。
繼承階層架構
IExecutionResource
需求
標頭: concrtrm.h
命名空間: concurrency
IExecutionResource::CurrentSubscriptionLevel 方法
傳回此執行資源目前與基礎硬體執行緒相關聯的已啟動虛擬處理器根和已訂閱的外部執行緒數目。
virtual unsigned int CurrentSubscriptionLevel() const = 0;
傳回值
目前的訂用帳戶層級。
備註
訂用帳戶層級會告訴您有多少個執行中的執行緒與硬體執行緒相關聯。 這只包含 Resource Manager 以已訂閱執行緒的形式感知的執行緒,以及正在主動執行執行緒 Proxy 的虛擬處理器根目錄。
呼叫 ISchedulerProxy::SubscribeCurrentThread 方法 ,或方法 ISchedulerProxy::RequestInitialVirtualProcessors ,並將 參數 doSubscribeCurrentThread
設定為值 true
,將硬體執行緒的訂用帳戶層級遞增一 個。 它們也會傳回 IExecutionResource
代表訂用帳戶的介面。 IExecutionResource::Remove 的對應呼叫 會將硬體執行緒的訂用帳戶層級遞減一。
使用 IVirtualProcessorRoot::Activate 方法 啟動虛擬處理器根目錄的動作,會將硬體執行緒的訂用帳戶層級遞增一個。 IVirtualProcessorRoot::D eactivate 方法,或 IExecutionResource::Remove 會在啟動的虛擬處理器根目錄上叫用時,將訂用帳戶層級遞減一。
Resource Manager 會使用訂用帳戶層級資訊作為判斷排程器之間何時移動資源的方式之一。
IExecutionResource::GetExecutionResourceId 方法
傳回此執行資源所代表之硬體執行緒的唯一識別碼。
virtual unsigned int GetExecutionResourceId() const = 0;
傳回值
此執行資源基礎之硬體執行緒的唯一識別碼。
備註
每個硬體執行緒都會由並行執行時間指派唯一識別碼。 如果多個執行資源是相關聯的硬體執行緒,它們都會有相同的執行資源識別碼。
IExecutionResource::GetNodeId 方法
傳回這個執行資源所屬之處理器節點的唯一識別碼。
virtual unsigned int GetNodeId() const = 0;
傳回值
處理器節點的唯一識別碼。
備註
並行執行時間代表系統上的硬體執行緒,以處理器節點群組表示。 節點通常衍生自系統的硬體拓撲。 例如,特定通訊端或特定 NUMA 節點上的所有處理器都可能屬於相同的處理器節點。 Resource Manager 會將唯一識別碼指派給這些節點,其開頭 0
為 ,包括 nodeCount - 1
,其中 nodeCount
代表系統上的處理器節點總數。
您可以從 GetProcessorNodeCount 函式 取得節點計數。
IExecutionResource::Remove 方法
將這個執行資源傳回 Resource Manager。
virtual void Remove(_Inout_ IScheduler* pScheduler) = 0;
參數
pScheduler
排程器的介面,提出移除此執行資源的要求。
備註
使用此方法可傳回獨立執行資源,以及與虛擬處理器根目錄相關聯的執行資源給 Resource Manager。
如果這是您從其中一種方法 ISchedulerProxy::SubscribeCurrentThread 或 ISchedulerProxy::RequestInitialVirtualProcessors 收到的獨立執行資源,則呼叫 方法 Remove
將會結束建立資源所代表的執行緒訂用帳戶。 您必須在關閉排程器 Proxy 之前結束所有線程訂閱,而且必須從建立訂閱的執行緒呼叫 Remove
。
虛擬處理器根同樣可以透過叫用 Remove
方法傳回至資源管理員,因為介面 IVirtualProcessorRoot
繼承自 IExecutionResource
介面。 您可能需要傳回虛擬處理器根目錄,以回應 IScheduler::RemoveVirtualProcessors 方法的呼叫 ,或當您使用從 ISchedulerProxy::CreateOversubscriber 方法取得的過度訂閱虛擬處理器根目錄時。 對於虛擬處理器根目錄,沒有任何限制執行緒可以叫 Remove
用 方法。
invalid_argument
如果 參數 pScheduler
設定為 NULL
,則會擲回 。
invalid_operation
如果 參數 pScheduler
與為此執行資源建立的排程器不同,或者,如果目前的執行緒與建立執行緒訂用帳戶的執行緒不同,則會擲回 。
另請參閱
意見反映
https://aka.ms/ContentUserFeedback。
即將推出:我們會在 2024 年淘汰 GitHub 問題,並以全新的意見反應系統取代並作為內容意見反應的渠道。 如需更多資訊,請參閱:提交及檢視以下的意見反映: