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