Share via


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

IExecutionResource

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 Devolução

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 Devolução

Um identificador inteiro.

Confira também

Namespace de simultaneidade