Partilhar via


Estrutura IThreadProxy

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