Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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