共用方式為


IVirtualProcessorRoot 結構

執行緒 Proxy 可以在其上執行的硬體執行緒的抽象概念。

語法

struct IVirtualProcessorRoot : public IExecutionResource;

成員

公用方法

名稱 描述
IVirtualProcessorRoot::Activate 讓與執行內容介面 pContext 相關聯的線程 Proxy 開始在這個虛擬處理器根目錄上執行。
IVirtualProcessorRoot::D eactivate 導致目前在此虛擬處理器根目錄上執行的線程 Proxy 停止分派執行內容。 線程 Proxy 會在呼叫 Activate 方法時繼續執行。
IVirtualProcessorRoot::EnsureAllTasksVisible 導致儲存在個別處理器記憶體階層中的數據,讓系統上的所有處理器都看得到。 它可確保在方法傳回之前,已在所有處理器上執行完整記憶體柵欄。
IVirtualProcessorRoot::GetId 傳回虛擬處理器根目錄的唯一標識碼。

備註

每個虛擬處理器根目錄都有相關聯的執行資源。 介面 IVirtualProcessorRoot 繼承自 IExecutionResource 介面。 多個虛擬處理器根目錄可能對應至相同的基礎硬體線程。

Resource Manager 會將虛擬處理器根目錄授與排程器,以響應資源的要求。 排程器可以使用虛擬處理器根目錄來執行工作,方法是使用執行內容加以啟用。

繼承階層架構

IExecutionResource

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;

傳回值

整數標識碼。

另請參閱

concurrency 命名空間