Estrutura IExecutionResource
Uma abstração para um thread de hardware.
Sintaxe
struct IExecutionResource;
Membros
Métodos públicos
Nome | Descrição |
---|---|
IExecutionResource::CurrentSubscriptionLevel | Retorna o número de raízes de processador virtual e threads externos inscritos ativados atualmente associados ao thread de hardware subjacente que esse recurso de execução representa. |
IExecutionResource::GetExecutionResourceId | Retorna um identificador exclusivo para o thread de hardware que esse recurso de execução representa. |
IExecutionResource::GetNodeId | Retorna um identificador exclusivo para o nó do processador ao qual esse recurso de execução pertence. |
IExecutionResource::Remove | Retorna esse recurso de execução para o Resource Manager. |
Comentários
Os recursos de execução podem ser autônomos ou associados às raízes de processador virtual. Um recurso de execução autônomo é criado quando um thread em seu aplicativo cria uma assinatura de thread. Os métodos ISchedulerProxy::SubscribeThread e ISchedulerProxy::RequestInitialVirtualProcessors criam assinaturas de thread e retornam uma interface IExecutionResource
que representa a assinatura. Criar uma assinatura de thread é uma maneira de informar ao Resource Manager que um determinado thread participará do trabalho na fila de um agendador, juntamente com as raízes de processador virtual que o Resource Manager atribuir ao agendador. O Resource Manager usa as informações para evitar sobrescrever threads de hardware onde for possível.
Hierarquia de herança
IExecutionResource
Requisitos
Cabeçalho: concrtrm.h
Namespace: concurrency
IExecutionResource::CurrentSubscriptionLevel Method
Retorna o número de raízes de processador virtual e threads externos inscritos ativados atualmente associados ao thread de hardware subjacente que esse recurso de execução representa.
virtual unsigned int CurrentSubscriptionLevel() const = 0;
Valor de retorno
O nível de assinatura atual.
Comentários
O nível de assinatura informa quantos threads em execução estão associados ao thread de hardware. Isso inclui apenas threads de que o Resource Manager está ciente na forma de threads inscritos, e raízes de processador virtual que estão executando ativamente proxies de thread.
Chamar o método ISchedulerProxy::SubscribeCurrentThread ou o método ISchedulerProxy::RequestInitialVirtualProcessors com o parâmetro doSubscribeCurrentThread
definido para o valor true
incrementa o nível de assinatura de um thread de hardware por um. Eles também retornam uma interface IExecutionResource
que representa a assinatura. Uma chamada correspondente ao IExecutionResource::Remove diminui o nível de assinatura do thread de hardware por um.
O ato de ativar uma raiz de processador virtual usando o método IVirtualProcessorRoot::Activate incrementa o nível de assinatura de um thread de hardware por um. Os métodos IVirtualProcessorRoot::Deactivate ou IExecutionResource::Remove diminuem o nível de assinatura por um quando invocados em uma raiz de processador virtual.
O Resource Manager usa informações de nível de assinatura como uma das maneiras de determinar quando mover recursos entre agendadores.
Método IExecutionResource::GetExecutionResourceId
Retorna um identificador exclusivo para o thread de hardware que esse recurso de execução representa.
virtual unsigned int GetExecutionResourceId() const = 0;
Valor de retorno
Um identificador exclusivo para o thread de hardware subjacente a esse recurso de execução.
Comentários
Cada thread de hardware recebe um identificador exclusivo pelo Runtime de Simultaneidade. Se vários recursos de execução forem threads de hardware associado, todos eles terão o mesmo identificador de recurso de execução.
Método IExecutionResource::GetNodeId
Retorna um identificador exclusivo para o nó do processador ao qual esse recurso de execução pertence.
virtual unsigned int GetNodeId() const = 0;
Valor de retorno
Um identificador exclusivo para um nó de processador.
Comentários
O Runtime de Simultaneidade representa threads de hardware no sistema em grupos de nós de processador. Os nós geralmente são derivados da topologia de hardware do sistema. Por exemplo, todos os processadores em um soquete específico ou em um nó NUMA específico podem pertencer ao mesmo nó do processador. O Resource Manager atribui identificadores exclusivos a esses nós, começando com 0
até e incluindonodeCount - 1
, em que nodeCount
representa o número total de nós de processador no sistema.
A contagem de nós pode ser obtida da função GetProcessorNodeCount.
Método IExecutionResource::Remove
Retorna esse recurso de execução para o Resource Manager.
virtual void Remove(_Inout_ IScheduler* pScheduler) = 0;
Parâmetros
pScheduler
Uma interface para o agendador que está fazendo a solicitação para remover esse recurso de execução.
Comentários
Use esse método para retornar recursos de execução autônomos, bem como recursos de execução associados às raízes de processador virtual para o Resource Manager.
Se esse for um recurso de execução autônomo que você recebeu de qualquer um dos métodos ISchedulerProxy::SubscribeCurrentThread ou ISchedulerProxy::RequestInitialVirtualProcessors, chamar o método Remove
encerrará a assinatura de thread que o recurso foi criado para representar. Você deve encerrar todas as assinaturas de thread antes de desligar um proxy de agendador, e deve chamar Remove
do thread que criou a assinatura.
As raízes de processador virtual também podem ser retornadas ao Resource Manager invocando o método Remove
, pois a interface IVirtualProcessorRoot
herda da interface IExecutionResource
. Pode ser necessário retornar uma raiz de processador virtual em resposta a uma chamada para o método IScheduler::RemoveVirtualProcessors ou quando você terminar com uma raiz de processador virtual com excesso de assinatura obtida do método ISchedulerProxy::CreateOversubscriber. No caso de raízes de processador virtual, não há restrições sobre qual thread pode invocar o método Remove
.
invalid_argument
será gerado se o parâmetro pScheduler
for definido como NULL
.
invalid_operation
será gerado se o parâmetro pScheduler
for diferente do agendador para o qual esse recurso de execução foi criado ou, com um recurso de execução autônomo, se o thread atual for diferente do thread que criou a assinatura de thread.