Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Uma abstração para um thread de execução. Dependendo da SchedulerType chave de política do agendador que criar, o Gestor de Recursos concede-lhe um proxy de thread que é suportado por uma thread Win32 regular ou uma thread agendada em modo utilizador (UMS). Os threads UMS são suportados em sistemas operativos de 64 bits com Windows 7 ou superior.
Sintaxe
struct IThreadProxy;
Membros
Métodos Públicos
| Nome | Description |
|---|---|
| IThreadProxi::GetId | Devolve um identificador único para o proxy da thread. |
| IThreadProxy::SwitchOut | Dissocia o contexto da raiz do processador virtual subjacente. |
| IThreadProxy::SwitchTo | Realiza uma troca cooperativa de contexto do contexto em execução para outro. |
| IThreadProxy::YieldToSystem | Faz com que a thread que chama dê a execução a outra thread pronta para correr no processador atual. O sistema operativo seleciona o próximo thread a ser executado. |
Observações
Os proxies de thread são acoplados a contextos de execução representados pela interface IExecutionContext como meio de despachar trabalho.
Hierarquia de herança
IThreadProxy
Requerimentos
Cabeçalho: concrtrm.h
Namespace: simultaneidade
Método IThreadProxy::GetId
Devolve um identificador único para o proxy da thread.
virtual unsigned int GetId() const = 0;
Valor de retorno
Um identificador inteiro único.
IThreadProxy ::Método SwitchOut
Dissocia 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 o switch. O parâmetro é do tipo SwitchingProxyState.
Observações
Use SwitchOut se precisar de dissociar um contexto da raiz do processador virtual onde está a ser executado, por qualquer motivo. Dependendo do valor que passa ao parâmetro switchState, e se está ou não a executar numa raiz de processador virtual, a chamada retornará imediatamente ou bloqueará o proxy da thread associado ao contexto. É um erro chamar SwitchOut com o parâmetro definido como Idle. Fazê-lo resultará numa exceção invalid_argument .
SwitchOut é útil quando se quer reduzir o número de raízes de processador virtual que o seu agendador tem, seja porque o Gestor de Recursos o instruiu a fazê-lo, seja porque solicitou uma raiz de processador virtual temporariamente sobrecarregada e acabou com isso. Neste caso, deve invocar o método IVirtualProcessorRoot::Remove na raiz do processador virtual, antes de fazer uma chamada a SwitchOut com o parâmetro switchState definido como Blocking. Isto irá bloquear o proxy da thread e retomará a execução quando uma raiz diferente de processador virtual no agendador estiver disponível para executá-la. O proxy de thread bloqueante pode ser retomado chamando a função SwitchTo para mudar para o contexto de execução deste proxy de thread. Também pode retomar o proxy do thread, usando o seu contexto associado para ativar uma raiz de processador virtual. Para mais informações sobre como fazer isto, consulte IVirtualProcessorRoot::Activate.
SwitchOut pode também ser usado quando se pretende reinicializar o processador virtual para que possa ser ativado no futuro, bloqueando o proxy do thread ou desligando-o temporariamente da raiz do processador virtual onde está a correr e do escalonador para o qual está a despachar trabalho. Use SwitchOut com o parâmetro switchState definido para Blocking se quiser bloquear o proxy de thread. Mais tarde, pode ser retomado usando SwitchTo ou IVirtualProcessorRoot::Activate, como referido acima. Use SwitchOut com o parâmetro definido para Nesting quando pretender desvincular temporariamente este proxy de thread da raiz do processador virtual no qual está a correr, bem como do agendador ao qual o processador virtual está associado. Chamar SwitchOut com o parâmetro switchState definido para Nesting enquanto está a executar numa raiz de processador virtual fará com que a raiz seja reinicializada e o proxy atual do thread continue a executar sem necessidade de um deles. O proxy do thread é considerado como tendo saído do agendador até que chame o método Blocking num momento posterior. A segunda chamada para SwitchOut com o parâmetro definido em Blocking destina-se a devolver o contexto a um estado bloqueado, para que possa ser retomado por SwitchTo ou IVirtualProcessorRoot::Activate pelo escalonador do qual se desligou. Como não estava a ser executado numa raiz de processador virtual, não ocorre reinicialização.
Uma raiz de processador virtual reiniciada não é diferente de uma raiz de processador virtual totalmente nova que o seu agendador recebeu através do Gestor de Recursos. Pode usá-lo para execução ativando-o com um contexto de execução usando IVirtualProcessorRoot::Activate.
SwitchOut deve ser chamado na IThreadProxy interface que representa o thread em execução atual, caso contrário os resultados são indefinidos.
Nas bibliotecas e cabeçalhos fornecidos com o Visual Studio 2010, este método não tomava um parâmetro nem reinicializava a raiz do processador virtual. Para preservar o comportamento antigo, é fornecido o valor padrão do parâmetro de Blocking .
Método IThreadProxy::SwitchTo
Realiza uma troca cooperativa de contexto do contexto em execução para outro.
virtual void SwitchTo(
_Inout_ IExecutionContext* pContext,
SwitchingProxyState switchState) = 0;
Parâmetros
pContexto
O contexto de execução para o qual trocar de forma cooperativa.
switchState
Indica o estado do proxy de thread que está executando o switch. O parâmetro é do tipo SwitchingProxyState.
Observações
Use este método para alternar de um contexto de execução para outro, a partir do método IExecutionContext::Dispatch do primeiro contexto de execução. O método associa o contexto pContext de execução a um proxy de thread se não estiver já associado a um. A propriedade do proxy atual do thread é determinada pelo valor que especificas para o switchState argumento.
Use o valor Idle quando quiser devolver o proxy do thread em execução ao Gestor de Recursos. Chamar SwitchTo com o parâmetro switchState definido em Idle fará com que o contexto pContext de execução comece a ser executado no recurso de execução subjacente. A propriedade deste proxy de tarefa é transferida para o Gestor de Recursos, e espera-se que voltes do método do contexto de execução Dispatch logo após SwitchTo retornar, para completar a transferência. O contexto de execução que o proxy da thread estava a despachar está dissociado do proxy, e o scheduler é livre de o reutilizar ou destruir conforme entender.
Usa o valor Blocking quando quiseres que este proxy de thread entre num estado bloqueado. Chamar SwitchTo com o parâmetro switchState definido para Blocking fará com que o contexto pContext de execução comece a ser executado e bloqueie o proxy atual do thread até que este seja retomado. O agendador mantém a propriedade do proxy da thread quando este está no Blocking estado. O proxy de thread bloqueante pode ser retomado chamando a função SwitchTo para mudar para o contexto de execução deste proxy de thread. Também pode retomar o proxy do thread, usando o seu contexto associado para ativar uma raiz de processador virtual. Para mais informações sobre como fazer isto, consulte IVirtualProcessorRoot::Activate.
Utilize o valor Nesting quando quiser desvincular temporariamente este proxy de thread da raiz do processador virtual onde está a ser executado e do escalonador para o qual está a distribuir trabalho. Chamar SwitchTo com o parâmetro switchState definido em Nesting fará com que o contexto pContext de execução comece a executar e o proxy atual da thread também continue a executar sem necessidade de uma raiz virtual do processador. O proxy do thread é considerado como tendo saído do agendador até que chame o método IThreadProxy::SwitchOut num momento posterior. O IThreadProxy::SwitchOut método pode bloquear o proxy do thread até que uma raiz de processador virtual esteja disponível para o reagendar.
SwitchTo deve ser chamado na IThreadProxy interface que representa o thread em execução atual, caso contrário os resultados são indefinidos. A função lança invalid_argument se o parâmetro pContext for definido como NULL.
Método IThreadProxy::YieldToSystem
Faz com que a thread que chama dê a execução a outra thread pronta para correr no processador atual. O sistema operativo seleciona o próximo thread a ser executado.
virtual void YieldToSystem() = 0;
Observações
Quando chamado por um proxy de thread suportado por um thread normal do Windows, YieldToSystem comporta-se exatamente como a função SwitchToThreaddo Windows . No entanto, quando chamada a partir de threads escalonáveis em modo utilizador (UMS), a SwitchToThread função delega a tarefa de escolher a próxima thread a executar ao escalonador do modo utilizador, não ao sistema operativo. Para alcançar o efeito desejado de mudar para uma thread pronta diferente no sistema, use YieldToSystem.
YieldToSystem deve ser chamado na IThreadProxy interface que representa o thread em execução atual, caso contrário os resultados são indefinidos.
Consulte também
concorrência Namespace
IExecutionContext Structure
Estrutura de IScheduler
IVirtualProcessorRoot Structure