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;
傳回值
整數標識碼。