Compartilhar via


Classe Context

Representa uma abstração para um contexto de execução.

Sintaxe

class Context;

Membros

Construtores Protegidos

Nome Descrição
Destrutor de Contexto

Métodos públicos

Nome Descrição
Bloquear Bloqueia o contexto atual.
CurrentContext Retorna um ponteiro para o contexto atual.
GetId Retorna um identificador para o contexto que é exclusivo dentro do agendador ao qual o contexto pertence.
GetScheduleGroupId Retorna um identificador para o grupo de agendamento no qual o contexto está trabalhando no momento.
GetVirtualProcessorId Retorna um identificador para o processador virtual no qual o contexto está sendo executado no momento.
Id Retorna um identificador para o contexto atual que é exclusivo dentro do agendador ao qual o contexto atual pertence.
IsCurrentTaskCollectionCanceling Retorna uma indicação de se a coleção de tarefas que está executando de forma embutida no contexto atual está sendo ativamente cancelada (ou estará em breve).
IsSynchronouslyBlocked Determina se o contexto está bloqueado de maneira síncrona ou não. Um contexto será considerado bloqueado de maneira síncrona se tiver executado explicitamente uma ação que levou ao bloqueio.
Sobrescrever Injeta um processador virtual adicional em um agendador durante um bloco de código quando invocado em um contexto executado em um dos processadores virtuais nesse agendador.
ScheduleGroupId Retorna um identificador para o grupo de agendamento em que o contexto atual está operando.
Unblock Desbloqueia o contexto e faz com que ele se torne executável.
VirtualProcessorId Retorna um identificador para o processador virtual no qual o contexto atual está sendo executado.
Rendimento Gera execução para que outro contexto possa ser executado. Se não houver nenhum outro contexto disponível para ceder, o agendador poderá ceder o controle para outro thread do sistema operacional.

Comentários

O agendador do Concurrency Runtime (confira Agendador) usa contextos de execução para realizar o trabalho enfileirado pelo seu aplicativo. Um thread Win32 é um exemplo de um contexto de execução em um sistema operacional Windows.

A qualquer momento, o nível de simultaneidade de um agendador é igual ao número de processadores virtuais concedidos a ele pelo Resource Manager. Um processador virtual é uma abstração de um recurso de processamento e é mapeado para um thread de hardware no sistema subjacente. Somente um contexto de agendador pode ser executado em um processador virtual em um dado momento.

O agendador é cooperativo por natureza, e um contexto de execução pode ceder seus processadores virtuais para outro contexto a qualquer momento, se desejar entrar em um estado de espera. Quando a espera for atendida, o processo não poderá ser executado novamente até que um processador virtual disponível do agendador comece a executá-lo.

Hierarquia de herança

Context

Requisitos

Cabeçalho: concrt.h

Namespace: simultaneidade

Bloquear

Bloqueia o contexto atual.

static void __cdecl Block();

Comentários

Esse método fará com que o agendador padrão do processo seja criado e/ou anexado ao contexto de chamada se não houver nenhum agendador atualmente associado ao contexto de chamada.

Se o contexto de chamada estiver em execução em um processador virtual, o processador virtual encontrará outro contexto executável para executar ou poderá criar um.

Depois que o método Block for chamado ou for ser chamado, você deverá emparelhá-lo com uma chamada ao método Unblock de outro contexto de execução para que ele seja executado novamente. Lembre-se de que há um período crítico entre o ponto em que seu código publica seu contexto para que outro thread possa chamar o método Unblock e o ponto em que a chamada real do método Block é feita. Durante esse período, você não deve chamar nenhum método que possa, por sua vez, bloquear e desbloquear por motivos próprios (por exemplo, adquirir um bloqueio). As chamadas aos métodos Block e Unblock não acompanham o motivo do bloqueio e do desbloqueio. Apenas um objeto deve ter a propriedade de um par Block- Unblock.

Esse método pode gerar uma variedade de exceções, incluindo scheduler_resource_allocation_error.

~Contexto

virtual ~Context();

ContextoAtual

Retorna um ponteiro para o contexto atual.

static Context* __cdecl CurrentContext();

Valor de retorno

Um ponteiro para o contexto atual.

Comentários

Esse método fará com que o agendador padrão do processo seja criado e/ou anexado ao contexto de chamada se não houver nenhum agendador atualmente associado ao contexto de chamada.

GetId

Retorna um identificador para o contexto que é exclusivo dentro do agendador ao qual o contexto pertence.

virtual unsigned int GetId() const = 0;

Valor de retorno

Um identificador para o contexto que é único dentro do agendador ao qual pertence.

IdentificadorGrupoAgenda (GetScheduleGroupId)

Retorna um identificador para o grupo de agendamento no qual o contexto está trabalhando no momento.

virtual unsigned int GetScheduleGroupId() const = 0;

Valor de retorno

Um identificador para o grupo de agendamento no qual o contexto está trabalhando atualmente.

Comentários

O valor retornado desse método é uma amostragem instantânea do grupo de agendamento em que o contexto está sendo executado. Se esse método for chamado em um contexto diferente do contexto atual, o valor poderá ser obsoleto no momento em que é retornado e não é confiável. Normalmente, esse método é usado apenas para fins de depuração ou rastreamento.

GetVirtualProcessorId

Retorna um identificador para o processador virtual no qual o contexto está sendo executado no momento.

virtual unsigned int GetVirtualProcessorId() const = 0;

Valor de retorno

Se o contexto estiver em execução no momento em um processador virtual, um identificador para o processador virtual no qual o contexto está sendo executado no momento; caso contrário, o valor -1.

Comentários

O valor retornado desse método é uma amostragem instantânea do processador virtual no qual o contexto está sendo executado. Esse valor pode se tornar obsoleto no momento em que é retornado e não é confiável. Normalmente, esse método é usado apenas para fins de depuração ou rastreamento.

ID

Retorna um identificador para o contexto atual que é exclusivo dentro do agendador ao qual o contexto atual pertence.

static unsigned int __cdecl Id();

Valor de retorno

Se o contexto atual estiver anexado a um agendador, será um identificador do contexto atual, exclusivo dentro do agendador ao qual o contexto atual pertence; caso contrário, o valor -1.

IsCurrentTaskCollectionCanceling

Retorna uma indicação de se a coleção de tarefas que está executando de forma embutida no contexto atual está sendo ativamente cancelada (ou estará em breve).

static bool __cdecl IsCurrentTaskCollectionCanceling();

Valor de retorno

Se um agendador estiver anexado ao contexto de chamada e um grupo de tarefas estiver executando uma tarefa embutida nesse contexto, uma indicação de se esse grupo de tarefas está (ou estará em breve) no meio de um cancelamento ativo; caso contrário, o valor false.

IsSynchronouslyBlocked

Determina se o contexto está bloqueado de maneira síncrona ou não. Um contexto será considerado bloqueado de maneira síncrona se tiver executado explicitamente uma ação que levou ao bloqueio.

virtual bool IsSynchronouslyBlocked() const = 0;

Valor de retorno

Se o contexto é bloqueado de maneira síncrona.

Comentários

Um contexto será considerado bloqueado de maneira síncrona se tiver executado explicitamente uma ação que levou ao bloqueio. No agendador de thread, isso indicaria uma chamada direta para o método Context::Block ou um objeto de sincronização criado usando o método Context::Block.

O valor retornado desse método é uma amostra instantânea de se o contexto é bloqueado de maneira síncrona. Esse valor pode estar obsoleto no momento em que é retornado e só pode ser usado em circunstâncias muito específicas.

operador delete

Um objeto Context é destruído internamente pelo runtime. Ele não pode ser excluído explicitamente.

void operator delete(void* _PObject);

Parâmetros

_PObject
Um ponteiro para o objeto a ser excluído.

Oversubscribe

Injeta um processador virtual adicional em um agendador durante um bloco de código quando invocado em um contexto executado em um dos processadores virtuais nesse agendador.

static void __cdecl Oversubscribe(bool _BeginOversubscription);

Parâmetros

_BeginOversubscription
Se true, uma indicação de que um processador virtual extra deve ser adicionado durante a sobresubscrição. Caso false, uma indicação de que a superassinatura deve terminar e o processador virtual adicionado anteriormente deve ser removido.

IdGrupoDeAgenda

Retorna um identificador para o grupo de agendamento em que o contexto atual está operando.

static unsigned int __cdecl ScheduleGroupId();

Valor de retorno

Se o contexto atual estiver anexado a um agendador e trabalhando em um grupo de programação, um identificador para o grupo de agendamento no qual o contexto atual está trabalhando; caso contrário, o valor -1.

Desbloquear

Desbloqueia o contexto e faz com que ele se torne executável.

virtual void Unblock() = 0;

Comentários

É perfeitamente legal que uma chamada ao método Unblock venha antes de uma chamada correspondente ao método Block. Desde que as chamadas aos métodos Block e Unblock sejam devidamente emparelhadas, o runtime manipulará corretamente a corrida natural de qualquer ordenação. Uma chamada a Unblock que vem antes de uma chamada a Block simplesmente nega o efeito da chamada Block.

Esse método pode gerar várias exceções. Se um contexto tentar chamar o método Unblock em si, uma exceção context_self_unblock será gerada. Se as chamadas a Block e Unblock não estiverem emparelhadas corretamente (por exemplo, duas chamadas a Unblock são feitas para um contexto que está em execução no momento), uma exceção context_unblock_unbalanced será gerada.

Lembre-se de que há um período crítico entre o ponto em que seu código publica seu contexto para que outro thread possa chamar o método Unblock e o ponto em que a chamada real do método Block é feita. Durante esse período, você não deve chamar nenhum método que possa, por sua vez, bloquear e desbloquear por motivos próprios (por exemplo, adquirir um bloqueio). As chamadas aos métodos Block e Unblock não acompanham o motivo do bloqueio e do desbloqueio. Apenas um objeto deve ter a propriedade de um par Block e Unblock.

VirtualProcessorId

Retorna um identificador para o processador virtual no qual o contexto atual está sendo executado.

static unsigned int __cdecl VirtualProcessorId();

Valor de retorno

Se o contexto atual estiver anexado a um agendador, um identificador para o processador virtual no qual o contexto atual está sendo executado; caso contrário, o valor -1.

Comentários

O valor retornado desse método é uma amostragem instantânea do processador virtual no qual o contexto atual está sendo executado. Esse valor pode se tornar obsoleto no momento em que é retornado e não é confiável. Normalmente, esse método é usado apenas para fins de depuração ou rastreamento.

Rendimento

Gera execução para que outro contexto possa ser executado. Se não houver nenhum outro contexto disponível para ceder, o agendador poderá ceder o controle para outro thread do sistema operacional.

static void __cdecl Yield();

Comentários

Esse método fará com que o agendador padrão do processo seja criado e/ou anexado ao contexto de chamada se não houver nenhum agendador atualmente associado ao contexto de chamada.

CederExecução

Gera execução para que outro contexto possa ser executado. Se não houver nenhum outro contexto disponível para ceder, o agendador poderá ceder o controle para outro thread do sistema operacional.

static void __cdecl YieldExecution();

Comentários

Esse método fará com que o agendador padrão do processo seja criado e/ou anexado ao contexto de chamada se não houver nenhum agendador atualmente associado ao contexto de chamada.

Essa função é nova no Visual Studio 2015 e idêntica à função Yield, mas não entra em conflito com a macro Yield no Windows.h.

Confira também

Namespace de concorrência
Classe Scheduler
Agendador de Tarefas