Partilhar via


Classe Context

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

Sintaxe

class Context;

Membros

Construtores Protegidos

Nome Descrição
Destruidor ~Context

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 agendado no qual o contexto está funcionando 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á em execução embutida no contexto atual está (ou estará em breve) no meio de um cancelamento ativo.
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.
Oversubscribe Injeta um processador virtual adicional em um agendador durante um bloqueio de código quando invocado em um contexto em execução em um dos processadores virtuais nesse agendador.
ScheduleGroupId Retorna um identificador para o grupo agendado no qual o contexto atual está funcionando.
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.
Produção Gera execução para que outro contexto possa ser executado. Se não houver nenhum outro contexto disponível para o qual suspender, o agendador poderá suspender para outro thread do sistema operacional.

Comentários

O agendador de Runtime de Simultaneidade (confira Agendador) usa contextos de execução para executar o trabalho enfileirado por 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 para um recurso de processamento e mapeia 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 poderá suspender seu processador virtual para um contexto diferente a qualquer momento se quiser entrar em um estado de espera. Quando a espera for atendida, ela não poderá ser retomada até que um processador virtual disponível do agendador comece a executá-la.

Hierarquia de herança

Context

Requisitos

Cabeçalho: concrt.h

Namespace: concurrency

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 para o qual a chamada de método Block real é 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.

~Context

virtual ~Context();

CurrentContext

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 é exclusivo dentro do agendador ao qual o contexto pertence.

GetScheduleGroupId

Retorna um identificador para o grupo agendado no qual o contexto está funcionando no momento.

virtual unsigned int GetScheduleGroupId() const = 0;

Valor de retorno

Um identificador para o grupo agendado no qual o contexto está trabalhando no momento.

Comentários

O valor retornado desse método é uma amostragem instantânea do grupo agendado no qual 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, um identificador para o 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á em execução embutida no contexto atual está (ou estará em breve) no meio de um cancelamento ativo.

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 bloqueio de código quando invocado em um contexto em execução 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 o excesso de assinatura. Se false, uma indicação de que o excesso de assinatura deve terminar e o processador virtual adicionado anteriormente deve ser removido.

ScheduleGroupId

Retorna um identificador para o grupo agendado no qual o contexto atual está funcionando.

static unsigned int __cdecl ScheduleGroupId();

Valor de retorno

Se o contexto atual estiver anexado a um agendador e trabalhando em um grupo agendado, um identificador para o grupo do agendador no qual o contexto atual está funcionando; caso contrário, o valor -1.

Unblock

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 para o qual a chamada de método Block real é 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.

Produção

Gera execução para que outro contexto possa ser executado. Se não houver nenhum outro contexto disponível para o qual suspender, o agendador poderá suspender 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.

YieldExecution

Gera execução para que outro contexto possa ser executado. Se não houver nenhum outro contexto disponível para o qual suspender, o agendador poderá suspender 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 simultaneidade
Classe Scheduler
Agendador de Tarefas