Partilhar via


Estrutura IThreadProxy

Uma abstração para um thread de execução. Dependendo da chave de política SchedulerType do agendador que você criar, o Resource Manager concederá a você um proxy de thread com o suporte de um thread do Win32 regular ou um thread UMS (agendável em modo de usuário). Os threads UMS têm suporte em sistemas operacionais de 64 bits com a versão Windows 7 e superior.

Sintaxe

struct IThreadProxy;

Membros

Métodos públicos

Nome Descrição
IThreadProxy::GetId Retorna um identificador exclusivo para o proxy de thread.
IThreadProxy::SwitchOut Desassocia o contexto da raiz do processador virtual subjacente.
IThreadProxy::SwitchTo Executa uma troca de contexto cooperativo do contexto atualmente em execução para um outro contexto diferente.
IThreadProxy::YieldToSystem Faz com que o thread de chamada conceda a execução para outro thread que está pronto para ser executado no processador atual. O sistema operacional seleciona o próximo thread a ser executado.

Comentários

Os proxies de thread são acoplados a contextos de execução representados pela interface IExecutionContext como um meio de expedição de trabalho.

Hierarquia de herança

IThreadProxy

Requisitos

Cabeçalho: concrtrm.h

Namespace: concurrency

Método IThreadProxy::GetId

Retorna um identificador exclusivo para o proxy de thread.

virtual unsigned int GetId() const = 0;

Valor de retorno

Um identificador inteiro exclusivo.

Método IThreadProxy::SwitchOut

Desassocia o contexto da raiz do processador virtual subjacente.

virtual void SwitchOut(SwitchingProxyState switchState = Blocking) = 0;

Parâmetros

switchState
Indica o estado do proxy de thread que está executando a troca. O parâmetro é do tipo SwitchingProxyState.

Comentários

Use SwitchOut se precisar, por qualquer motivo, desassociar um contexto da raiz de processador virtual onde ele está sendo executado. Dependendo do valor que você passa para o parâmetro switchState e se ele está ou não em execução em uma raiz de processador virtual, a chamada retornará imediatamente ou bloqueará o proxy de thread associado ao contexto. É um erro chamar SwitchOut com o parâmetro definido como Idle. Isso resultará em uma exceção de invalid_argument.

SwitchOut é útil quando você deseja reduzir o número de raízes de processador virtual que seu agendador tem, seja porque o Resource Manager instruiu você a fazer isso, ou porque você solicitou uma raiz temporária de processador virtual subscrito e já terminou de usá-la. Nesse caso, você deve invocar o método IVirtualProcessorRoot::Remove na raiz de processador virtual antes de fazer uma chamada SwitchOut com o parâmetro switchState definido como Blocking. Isso bloqueará o proxy de thread e ele retomará a execução quando uma raiz de processador virtual diferente no agendador estiver disponível para executá-lo. O proxy de thread de bloqueio pode ser retomado chamando a função SwitchTo para alternar para o contexto de execução desse proxy de thread. Você também pode retomar o proxy de thread usando seu contexto associado para ativar uma raiz de processador virtual. Para obter mais informações sobre isso, consulte IVirtualProcessorRoot::Activate.

SwitchOut também pode ser usado quando você quiser reinicializar o processador virtual para que ele possa ser ativado no futuro, bloqueando o proxy de thread ou desanexando-o temporariamente da raiz do processador virtual em que ele está sendo executado e do agendador para o qual ele está expedindo o trabalho. Use SwitchOut com o parâmetro switchState definido como Blocking se você deseja bloquear o proxy de thread. Posteriormente, ele pode ser retomado usando SwitchTo ou IVirtualProcessorRoot::Activate, conforme indicado acima. Use SwitchOut com o parâmetro definido como Nesting quando você deseja desanexar temporariamente esse proxy de thread da raiz de processador virtual onde ele está em execução e do agendador ao qual o processador virtual está associado. Chamar SwitchOut com o parâmetro switchState definido como Nesting enquanto ele está sendo executado em uma raiz de processador virtual fará com que a raiz seja reinicializada e o proxy de thread atual continue em execução sem a necessidade de uma. Considera-se que o proxy de thread deixou o agendador até chamar o método IThreadProxy::SwitchOut com Blocking em um momento posterior. A segunda chamada para SwitchOut com o parâmetro definido como Blocking destina-se a retornar o contexto para um estado bloqueado para que ele possa ser retomado pelo SwitchTo ou IVirtualProcessorRoot::Activate no agendador do qual ele se desanexou. Como ele não estava em execução em uma raiz de processador virtual, nenhuma reinicialização ocorrerá.

Uma raiz de processador virtual reinicializada não é diferente de uma nova raiz de processador virtual que seu agendador tenha recebido do Resource Manager. Você pode usá-lo para execução ativando-o com um contexto de execução usando IVirtualProcessorRoot::Activate.

SwitchOut deve ser chamado na interface IThreadProxy que representa o thread em execução no momento ou os resultados serão indefinidos.

Nas bibliotecas e cabeçalhos que foram enviados com o Visual Studio 2010, esse método não recebeu um parâmetro e não reinicializou a raiz do processador virtual. Para preservar o comportamento antigo, o valor de Blocking do parâmetro padrão é fornecido.

Método IThreadProxy::SwitchTo

Executa uma troca de contexto cooperativo do contexto atualmente em execução para um outro contexto diferente.

virtual void SwitchTo(
    _Inout_ IExecutionContext* pContext,
    SwitchingProxyState switchState) = 0;

Parâmetros

pContext
O contexto de execução para o qual alternar cooperativamente.

switchState
Indica o estado do proxy de thread que está executando a troca. O parâmetro é do tipo SwitchingProxyState.

Comentários

Use esse método para alternar de um contexto de execução para outro, do método IExecutionContext::Dispatch do primeiro contexto de execução. O método associará o contexto de execução pContext a um proxy de thread se ele ainda não estiver associado a um. A propriedade do proxy de thread atual é determinada pelo valor especificado para o argumento switchState.

Use o valor Idle quando quiser retornar o proxy de thread em execução no momento para o Resource Manager. Chamar SwitchTo com o parâmetro switchState definido como Idle fará com que o contexto de execução pContext comece a ser executado no recurso de execução subjacente. A propriedade desse proxy de thread é transferida para o Resource Manager e espera-se que você retorne do método Dispatch do contexto de execução logo após o retorno de SwitchTo, a fim de concluir a transferência. O contexto de execução que o proxy de thread estava expedindo é desassociado do proxy de thread e o agendador é livre para reutilizá-lo ou destruí-lo conforme achar melhor.

Use o valor Blocking quando quiser que esse proxy de thread insira um estado bloqueado. Chamar SwitchTo com o parâmetro switchState definido como Blocking fará com que o contexto de execução pContext comece a ser executado e bloqueie o proxy de thread atual até que ele seja retomado. O agendador retém a propriedade do proxy de thread quando o proxy de thread está no estado Blocking. O proxy de thread de bloqueio pode ser retomado chamando a função SwitchTo para alternar para o contexto de execução desse proxy de thread. Você também pode retomar o proxy de thread usando seu contexto associado para ativar uma raiz de processador virtual. Para obter mais informações sobre isso, consulte IVirtualProcessorRoot::Activate.

Use o valor Nesting quando quiser desanexar temporariamente esse proxy de thread da raiz de processador virtual onde ele está em execução e do agendador para o qual ele está expedindo o trabalho. Chamar SwitchTo com o parâmetro switchState definido como Nesting fará com que o contexto de execução pContext comece a ser executado e o proxy de thread atual também continue sendo executado sem a necessidade de uma raiz de processador virtual. Considera-se que o proxy de thread deixou o agendador até chamar o método IThreadProxy::SwitchOut em um momento posterior. O método IThreadProxy::SwitchOut pode bloquear o proxy de thread até que uma raiz de processador virtual esteja disponível para reagendá-lo.

SwitchTo deve ser chamado na interface IThreadProxy que representa o thread em execução no momento ou os resultados serão indefinidos. A função lançará invalid_argument se o parâmetro pContext estiver definido como NULL.

Método IThreadProxy::YieldToSystem

Faz com que o thread de chamada conceda a execução para outro thread que está pronto para ser executado no processador atual. O sistema operacional seleciona o próximo thread a ser executado.

virtual void YieldToSystem() = 0;

Comentários

Quando chamado por um proxy de thread apoiado por um thread regular do Windows, YieldToSystem se comporta exatamente como a função SwitchToThread do Windows. No entanto, quando chamada de threads UMS (agendável em modo de usuário), a função SwitchToThread delega a tarefa de escolher o próximo thread a ser executado para o agendador em modo de usuário, não para o sistema operacional. Para obter o efeito desejado de alternar para um thread pronto diferente no sistema, use YieldToSystem.

YieldToSystem deve ser chamado na interface IThreadProxy que representa o thread em execução no momento ou os resultados serão indefinidos.

Confira também

Namespace de simultaneidade
Estrutura IExecutionContext
Estrutura IScheduler
Estrutura IVirtualProcessorRoot