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