IVirtualProcessorRoot 結構
執行緒 Proxy 可以在其上執行的硬體執行緒的抽象概念。
語法
struct IVirtualProcessorRoot : public IExecutionResource;
成員
公用方法
名稱 | 描述 |
---|---|
IVirtualProcessorRoot::Activate | 讓與執行內容介面 pContext 相關聯的執行緒 Proxy 開始在這個虛擬處理器根目錄上執行。 |
IVirtualProcessorRoot::D eactivate | 導致目前在此虛擬處理器根目錄上執行的執行緒 Proxy 停止分派執行內容。 執行緒 Proxy 會在呼叫 Activate 方法時繼續執行。 |
IVirtualProcessorRoot::EnsureAllTasksVisible | 導致儲存在個別處理器記憶體階層中的資料,讓系統上的所有處理器都看得到。 它可確保在方法傳回之前,已在所有處理器上執行完整記憶體柵欄。 |
IVirtualProcessorRoot::GetId | 傳回虛擬處理器根目錄的唯一識別碼。 |
備註
每個虛擬處理器根目錄都有相關聯的執行資源。 介面 IVirtualProcessorRoot
繼承自 IExecutionResource 介面。 多個虛擬處理器根目錄可能對應至相同的基礎硬體執行緒。
Resource Manager 會將虛擬處理器根目錄授與排程器,以回應資源的要求。 排程器可以使用虛擬處理器根目錄來執行工作,方法是使用執行內容加以啟用。
繼承階層架構
IVirtualProcessorRoot
需求
標頭: concrtrm.h
命名空間: concurrency
IVirtualProcessorRoot::Activate 方法
讓與執行內容介面 pContext
相關聯的執行緒 Proxy 開始在這個虛擬處理器根目錄上執行。
virtual void Activate(_Inout_ IExecutionContext* pContext) = 0;
參數
pContext
將在此虛擬處理器根目錄上分派之執行內容的介面。
備註
如果資源管理員未與執行內容介面相關聯,則資源管理員會提供執行緒 Proxy pContext
Activate
方法可用來開始在 Resource Manager 傳回的新虛擬處理器根目錄上執行工作,或繼續已停用或即將停用之虛擬處理器根目錄上的執行緒 Proxy。 如需停用的詳細資訊,請參閱 IVirtualProcessorRoot::D eactivate 。 當您繼續停用的虛擬處理器根目錄時,參數 pContext
必須與用來停用虛擬處理器根目錄的參數相同。
第一次啟用虛擬處理器根目錄之後,後續的呼叫 Deactivate
配對可能會 Activate
彼此競爭。 這表示 Resource Manager 在收到 Deactivate
所要呼叫之前,可以接受 Activate
呼叫。
當您啟動虛擬處理器根目錄時,您會向 Resource Manager 發出訊號,指出此虛擬處理器根目錄目前正忙於工作。 如果您的排程器找不到要在此根目錄上執行的任何工作,則預期會叫 Deactivate
用 方法,告知 Resource Manager 虛擬處理器根目錄閒置。 Resource Manager 會使用此資料來平衡系統負載。
invalid_argument
如果引數 pContext
具有 值 NULL
,則會擲回 。
invalid_operation
如果 引數 pContext
不代表這個虛擬處理器根目錄最近分派的執行內容,則會擲回 。
啟動虛擬處理器根目錄的動作,會將基礎硬體執行緒的訂用帳戶層級增加一個。 如需訂用帳戶層級的詳細資訊,請參閱 IExecutionResource::CurrentSubscriptionLevel 。
IVirtualProcessorRoot::D eactivate 方法
導致目前在此虛擬處理器根目錄上執行的執行緒 Proxy 停止分派執行內容。 執行緒 Proxy 會在呼叫 Activate
方法時繼續執行。
virtual bool Deactivate(_Inout_ IExecutionContext* pContext) = 0;
參數
pContext
此根目錄目前正在分派的內容。
傳回值
boolean 值。 的值 true
表示從 Deactivate
方法傳回的執行緒 Proxy,以回應方法的 Activate
呼叫。 的值 false
表示從 方法傳回的執行緒 Proxy,以回應 Resource Manager 中的通知事件。 在使用者模式可排程器 (UMS) 執行緒排程器上,這表示專案已出現在排程器的完成清單中,而且需要排程器來處理這些專案。
備註
當您在排程器中找不到任何工作時,請使用此方法暫時停止執行虛擬處理器根目錄。 對 方法的 Deactivate
呼叫必須源自 Dispatch
于上次啟動虛擬處理器根目錄的執行內容方法內。 換句話說,叫用 方法的執行緒 Proxy Deactivate
必須是目前在虛擬處理器根目錄上執行的執行緒 Proxy。 在您未執行的虛擬處理器根目錄上呼叫 方法可能會導致未定義的行為。
停用的虛擬處理器根目錄可能會透過對 方法的 Activate
呼叫來喚醒,其引數與傳遞至 Deactivate
方法的引數相同。 排程器負責確保對 和 Deactivate
方法的呼叫 Activate
已配對,但不需要以特定順序接收它們。 Resource Manager 可以處理接收方法的呼叫 Activate
,然後才收到其所要方法的 Deactivate
呼叫。
如果虛擬處理器根目錄覺醒,而且方法的 Deactivate
傳回值是 值 false
,排程器應該透過 IUMSCompletionList::GetUnblockNotifications
方法查詢 UMS 完成清單、處理該資訊,然後接著再次呼叫 Deactivate
方法。 這應該重複,直到方法傳 Deactivate
回 值 true
等時間為止。
invalid_argument
如果引數 pContext
具有 Null 值,則會擲回 。
invalid_operation
如果虛擬處理器根目錄從未啟動,或 引數 pContext
不代表這個虛擬處理器根目錄最近分派的執行內容,則會擲回 。
停用虛擬處理器根目錄的行為會將基礎硬體執行緒的訂用帳戶層級減少一個。 如需訂用帳戶層級的詳細資訊,請參閱 IExecutionResource::CurrentSubscriptionLevel 。
IVirtualProcessorRoot::EnsureAllTasksVisible 方法
導致儲存在個別處理器記憶體階層中的資料,讓系統上的所有處理器都看得到。 它可確保在方法傳回之前,已在所有處理器上執行完整記憶體柵欄。
virtual void EnsureAllTasksVisible(_Inout_ IExecutionContext* pContext) = 0;
參數
pContext
此虛擬處理器根目錄目前正在分派的內容。
備註
當您想要將虛擬處理器根目錄的停用與將新工作新增至排程器時,您可能會發現這個方法很有用。 基於效能考慮,您可能會決定在不執行記憶體屏障的情況下,將工作專案新增至排程器,這表示在一個處理器上執行的執行緒所新增的工作專案不會立即顯示給所有其他處理器。 藉由搭配 Deactivate
方法使用此方法,您可以確定排程器不會停用其所有虛擬處理器根目錄,而工作專案存在於排程器的集合中。
對 方法的 EnsureAllTasksVisibleThe
呼叫必須源自 Dispatch
于上次啟動虛擬處理器根目錄的執行內容方法內。 換句話說,叫用 方法的執行緒 Proxy EnsureAllTasksVisible
必須是目前在虛擬處理器根目錄上執行的執行緒 Proxy。 在您未執行的虛擬處理器根目錄上呼叫 方法可能會導致未定義的行為。
invalid_argument
如果引數 pContext
具有 值 NULL
,則會擲回 。
invalid_operation
如果虛擬處理器根目錄從未啟動,或 引數 pContext
不代表這個虛擬處理器根目錄最近分派的執行內容,則會擲回 。
IVirtualProcessorRoot::GetId 方法
傳回虛擬處理器根目錄的唯一識別碼。
virtual unsigned int GetId() const = 0;
傳回值
整數識別碼。
另請參閱
意見反映
https://aka.ms/ContentUserFeedback。
即將推出:我們會在 2024 年淘汰 GitHub 問題,並以全新的意見反應系統取代並作為內容意見反應的渠道。 如需更多資訊,請參閱:提交及檢視以下的意見反映: