Estrutura IVirtualProcessorRoot
Uma abstração para um thread de hardware no qual um proxy de thread pode ser executado.
Sintaxe
struct IVirtualProcessorRoot : public IExecutionResource;
Membros
Métodos públicos
Nome | Descrição |
---|---|
IVirtualProcessorRoot::Activate | Faz com que o proxy de thread associado à interface pContext de contexto de execução comece a ser executado nessa raiz de processador virtual. |
IVirtualProcessorRoot::Deactivate | Faz com que o proxy de thread atualmente em execução nessa raiz de processador virtual pare de expedir o contexto de execução. O proxy de thread retomará a execução em uma chamada ao método Activate . |
IVirtualProcessorRoot::EnsureAllTasksVisible | Faz com que os dados armazenados na hierarquia de memória de processadores individuais se tornem visíveis para todos os processadores no sistema. Garante que uma cerca de memória completa tenha sido executada em todos os processadores antes do retorno do método. |
IVirtualProcessorRoot::GetId | Retorna um identificador exclusivo para a raiz de processador virtual. |
Comentários
Cada raiz de processador virtual tem um recurso de execução associado. A interface IVirtualProcessorRoot
herda da interface IExecutionResource. Várias raízes de processador virtual podem corresponder ao mesmo thread de hardware subjacente.
O Resource Manager concede raízes de processador virtual aos agendadores em resposta a solicitações de recursos. Um agendador pode usar uma raiz de processador virtual para executar o trabalho ativando-o com um contexto de execução.
Hierarquia de herança
IVirtualProcessorRoot
Requisitos
Cabeçalho: concrtrm.h
Namespace: concurrency
Método IVirtualProcessorRoot::Activate
Faz com que o proxy de thread associado à interface pContext
de contexto de execução comece a ser executado nessa raiz de processador virtual.
virtual void Activate(_Inout_ IExecutionContext* pContext) = 0;
Parâmetros
pContext
Uma interface para o contexto de execução que será expedida nessa raiz de processador virtual.
Comentários
O Resource Manager fornecerá um proxy de thread se não houver um associado à interface de contexto de execução pContext
O método Activate
pode ser usado para começar a executar o trabalho em uma nova raiz de processador virtual retornada pelo Resource Manager ou para retomar o proxy de thread em uma raiz de processador virtual desativada ou prestes a ser desativada. Confira IVirtualProcessorRoot::Deactivate para mais informações sobre a desativação. Quando você está retomando uma raiz de processador virtual desativada, o parâmetro pContext
deve ser o mesmo que o parâmetro usado para desativar a raiz de processador virtual.
Depois que uma raiz de processador virtual é ativada pela primeira vez, os pares subsequentes de chamadas a Deactivate
e Activate
podem correr entre si. Isso significa que é aceitável que o Resource Manager receba uma chamada a Activate
antes de receber a chamada a Deactivate
à qual se destina.
Ao ativar uma raiz de processador virtual, você sinaliza para o Resource Manager que essa raiz de processador virtual está ocupada no momento com o trabalho. Se o agendador não conseguir encontrar nenhum trabalho para executar nessa raiz, ele deve invocar o método Deactivate
informando o Resource Manager de que a raiz de processador virtual está ociosa. O Resource Manager usa esses dados para balancear a carga do sistema.
invalid_argument
será gerado se o argumento pContext
tiver o valor NULL
.
invalid_operation
será gerado se o argumento pContext
não representar o contexto de execução expedido mais recentemente por essa raiz de processador virtual.
O ato de ativar uma raiz de processador virtual aumenta o nível de assinatura do thread de hardware subjacente em um. Para obter mais informações sobre os níveis de assinatura, consulte IExecutionResource::CurrentSubscriptionLevel.
Método IVirtualProcessorRoot::D eactivate
Faz com que o proxy de thread atualmente em execução nessa raiz de processador virtual pare de expedir o contexto de execução. O proxy de thread retomará a execução em uma chamada ao método Activate
.
virtual bool Deactivate(_Inout_ IExecutionContext* pContext) = 0;
Parâmetros
pContext
O contexto que está sendo expedido por essa raiz no momento.
Valor de retorno
Um valor booliano. Um valor de true
indica que o proxy de thread retornou do método Deactivate
em resposta a uma chamada ao método Activate
. Um valor de false
indica que o proxy de thread retornou do método em resposta a um evento de notificação no Resource Manager. Em um agendador de thread (UMS) no modo de usuário, isso indica que os itens apareceram na lista de conclusão do agendador e o agendador precisa lidar com eles.
Comentários
Use esse método para interromper temporariamente a execução de uma raiz de processador virtual quando você não encontrar nenhum trabalho em seu agendador. Uma chamada para o método Deactivate
deve se originar de dentro do método Dispatch
do contexto de execução com o qual a raiz de processador virtual foi ativada pela última vez. Em outras palavras, o proxy de thread invocando o método Deactivate
deve ser aquele que está sendo executado atualmente na raiz de processador virtual. Chamar o método em uma raiz de processador virtual na qual você não está executando pode resultar em um comportamento indefinido.
Uma raiz de processador virtual desativada pode ser despertada com uma chamada para o método Activate
, com o mesmo argumento passado para o método Deactivate
. O agendador é responsável por garantir que as chamadas aos métodos Activate
e Deactivate
sejam emparelhadas, mas não precisam ser recebidos em uma ordem específica. O Resource Manager pode lidar com o recebimento de uma chamada para o método Activate
antes de receber uma chamada para o método para o Deactivate
ao qual ele se destinava.
Se uma raiz de processador virtual despertar e o valor retornado do método Deactivate
for o valor false
, o agendador deverá consultar a lista de conclusão UMS por meio do método IUMSCompletionList::GetUnblockNotifications
, agir quanto a essas informações e chamar o método Deactivate
novamente. Isso deve ser repetido até que o método Deactivate
retorne o valor true
.
invalid_argument
será gerado se o argumento pContext
tiver o valor NULL.
invalid_operation
será gerado se a raiz de processador virtual nunca tiver sido ativada ou se o argumento pContext
não representar o contexto de execução que foi expedido mais recentemente por essa raiz de processador virtual.
O ato de desativar uma raiz de processador virtual diminui o nível de assinatura do thread de hardware subjacente em um. Para obter mais informações sobre os níveis de assinatura, consulte IExecutionResource::CurrentSubscriptionLevel.
Método IVirtualProcessorRoot::EnsureAllTasksVisible
Faz com que os dados armazenados na hierarquia de memória de processadores individuais se tornem visíveis para todos os processadores no sistema. Garante que uma cerca de memória completa tenha sido executada em todos os processadores antes do retorno do método.
virtual void EnsureAllTasksVisible(_Inout_ IExecutionContext* pContext) = 0;
Parâmetros
pContext
O contexto que está sendo expedido por essa raiz de processador virtual no momento.
Comentários
Esse método pode ser útil para sincronizar a desativação de uma raiz de processador virtual com a adição de um novo trabalho ao agendador. Por motivos de desempenho, você pode adicionar itens de trabalho ao agendador sem executar uma barreira de memória, assim, os itens de trabalho adicionados por um thread em execução em um processador não ficam imediatamente visíveis a todos os outros processadores. Usando esse método combinado ao método Deactivate
, você pode garantir que o agendador não desative todas as suas raízes de processador virtual enquanto há itens de trabalho nas coleções do agendador.
Uma chamada para o método EnsureAllTasksVisibleThe
deve se originar de dentro do método Dispatch
do contexto de execução com o qual a raiz de processador virtual foi ativada pela última vez. Em outras palavras, o proxy de thread invocando o método EnsureAllTasksVisible
deve ser aquele que está sendo executado atualmente na raiz de processador virtual. Chamar o método em uma raiz de processador virtual na qual você não está executando pode resultar em um comportamento indefinido.
invalid_argument
será gerado se o argumento pContext
tiver o valor NULL
.
invalid_operation
será gerado se a raiz de processador virtual nunca tiver sido ativada ou se o argumento pContext
não representar o contexto de execução que foi expedido mais recentemente por essa raiz de processador virtual.
Método IVirtualProcessorRoot::GetId
Retorna um identificador exclusivo para a raiz de processador virtual.
virtual unsigned int GetId() const = 0;
Valor de retorno
Um identificador inteiro.