Partilhar via


Classe de Contexto

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

Sintaxe

class Context;

Membros

Construtores Protegidos

Nome Description
~Destruidor de Contexto

Métodos Públicos

Nome Description
Bloquear Bloqueia o contexto atual.
Contexto Atual Devolve um ponteiro para o contexto atual.
GetId Devolve um identificador para o contexto que é único dentro do escalonador ao qual o contexto pertence.
GetScheduleGroupId Devolve um identificador para o grupo de agendamento em que o contexto está a trabalhar atualmente.
GetVirtualProcessorId Devolve um identificador para o processador virtual onde o contexto está a ser executado.
Id Devolve um identificador para o contexto atual que é único dentro do escalonador ao qual pertence o contexto atual.
IsCurrentTaskCollectionCanceling Devolve uma indicação de se a coleção de tarefas que está atualmente a ser executada inline no contexto atual está em meio a um cancelamento ativo (ou estará em breve).
IsSynchronouslyBlocked Determina se o contexto está ou não bloqueado de forma síncrona. Um contexto é considerado bloqueado síncronicamente se realizou explicitamente uma ação que levou ao bloqueio.
Sobresubscrever Injeta um processador virtual adicional num agendador durante a duração de um bloco de código quando invocado num contexto a ser executado num dos processadores virtuais desse agendador.
ScheduleGroupId Devolve um identificador para o grupo de agendamento em que o contexto atual está a trabalhar.
Desbloquear Desbloqueia o contexto e faz com que se torne executável.
VirtualProcessorId Devolve um identificador para o processador virtual onde o contexto atual está a ser executado.
Rendimento Gera execução para que outro contexto possa ser executado. Se não houver outro contexto disponível para ceder, o escalonador pode ceder a outra linha de execução do sistema operativo.

Observações

O agendador de tempo de execução de simultaneidade (ver Agendador) utiliza contextos de execução para processar o trabalho que está em fila na sua aplicação. Um thread Win32 é um exemplo de contexto de execução num sistema operativo Windows.

A qualquer momento, o nível de concorrência de um agendador é igual ao número de processadores virtuais concedidos pelo Gestor de Recursos. Um processador virtual é uma abstração de um recurso de processamento e mapeia para um thread de hardware no sistema subjacente. Apenas um único contexto de agendador pode ser executado num processador virtual num dado momento.

O agendador é cooperativo por natureza e um contexto em execução pode ceder o seu processador virtual a um contexto diferente a qualquer momento, se desejar entrar num estado de espera. Quando a sua espera está satisfeita, não pode retomar até que um processador virtual disponível do escalonador comece a executá-lo.

Hierarquia de herança

Context

Requerimentos

Cabeçalho: concrt.h

Namespace: simultaneidade

Block

Bloqueia o contexto atual.

static void __cdecl Block();

Observações

Este método resultará na criação e/ou anexação do agendador padrão do processo ao contexto de chamada se não houver agendador atualmente associado ao contexto de chamada.

Se o contexto de chamada estiver a correr num processador virtual, o processador virtual encontrará outro contexto executável para executar ou pode potencialmente criar um novo.

Depois de o método Block ter sido chamado ou será chamado, deve associá-lo a uma chamada ao método Unblock a partir de outro contexto de execução para que possa ser executado novamente. Tenha em atenção que existe um período crítico entre o momento em que o seu código publica o seu contexto para outro thread poder chamar o método Unblock e o momento em que é feita a chamada ao método Block. Durante este período, não deve chamar nenhum método que possa, por sua vez, bloquear e desbloquear por razões próprias (por exemplo, adquirir um bloqueio). As chamadas ao Block método e Unblock não rastreiam a razão do bloqueio e desbloqueio. Apenas um objeto deve ter posse de um Block- Unblock par.

Este método pode lançar várias exceções, incluindo scheduler_resource_allocation_error.

~Contexto

virtual ~Context();

Contexto Atual

Devolve um ponteiro para o contexto atual.

static Context* __cdecl CurrentContext();

Valor de retorno

Um indicador para o contexto atual.

Observações

Este método resultará na criação e/ou anexação do agendador padrão do processo ao contexto de chamada se não houver agendador atualmente associado ao contexto de chamada.

GetId

Devolve um identificador para o contexto que é único dentro do escalonador ao qual o contexto pertence.

virtual unsigned int GetId() const = 0;

Valor de retorno

Um identificador para o contexto que é exclusivo dentro do sistema de escalonamento ao qual o contexto pertence.

GetScheduleGroupId

Devolve um identificador para o grupo de agendamento em que o contexto está a trabalhar atualmente.

virtual unsigned int GetScheduleGroupId() const = 0;

Valor de retorno

Um identificador para o grupo de agendamento em que o contexto está atualmente a trabalhar.

Observações

O valor de retorno deste método é uma amostragem instantânea do grupo de agendamento sobre o qual o contexto está a ser executado. Se este método for chamado num contexto diferente do atual, o valor pode ficar obsoleto no momento em que é devolvido e não pode ser considerado confiável. Normalmente, este método é usado apenas para fins de depuração ou rastreamento.

GetVirtualProcessorId

Devolve um identificador para o processador virtual onde o contexto está a ser executado.

virtual unsigned int GetVirtualProcessorId() const = 0;

Valor de retorno

Se o contexto estiver atualmente a ser executado num processador virtual, um identificador para o processador virtual onde o contexto está a ser executado; caso contrário, o valor -1.

Observações

O valor de retorno deste método é uma amostragem instantânea do processador virtual onde o contexto está a ser executado. Este valor pode ficar obsoleto no momento em que é devolvido e não pode ser confiável. Normalmente, este método é usado apenas para fins de depuração ou rastreamento.

Id

Devolve um identificador para o contexto atual que é único dentro do escalonador ao qual pertence o contexto atual.

static unsigned int __cdecl Id();

Valor de retorno

Se o contexto atual estiver associado a um escalonador, então há um identificador único para o contexto dentro desse escalonador; caso contrário, o valor -1.

IsCurrentTaskCollectionCanceling

Devolve uma indicação de se a coleção de tarefas que está atualmente a ser executada inline no contexto atual está em meio a um cancelamento ativo (ou estará em breve).

static bool __cdecl IsCurrentTaskCollectionCanceling();

Valor de retorno

Se um escalonador estiver associado ao contexto de chamada e um grupo de tarefas estiver a executar uma tarefa em linha nesse contexto, deve ser indicado se esse grupo de tarefas está atualmente em processo de cancelamento ativo (ou estará em breve); caso contrário, o valor false.

IsSynchronouslyBlocked

Determina se o contexto está ou não bloqueado de forma síncrona. Um contexto é considerado bloqueado síncronicamente se realizou explicitamente uma ação que levou ao bloqueio.

virtual bool IsSynchronouslyBlocked() const = 0;

Valor de retorno

Se o contexto está bloqueado de forma síncrona.

Observações

Um contexto é considerado bloqueado síncronicamente se realizou explicitamente uma ação que levou ao bloqueio. No planeador de threads, isto indicaria uma chamada direta ao Context::Block método ou a um objeto de sincronização construído usando o Context::Block método.

O valor de retorno deste método é uma amostra instantânea de saber se o contexto está bloqueado de forma síncrona. Este valor pode ficar obsoleto no momento em que é devolvido e só pode ser usado em circunstâncias muito específicas.

Operador eliminar

Um Context objeto é destruído internamente pelo tempo de execução. Não pode ser explicitamente eliminado.

void operator delete(void* _PObject);

Parâmetros

_PObject
Um apontador para o objeto a ser eliminado.

Sobresubscrever

Injeta um processador virtual adicional num agendador durante a duração de um bloco de código quando invocado num contexto a ser executado num dos processadores virtuais desse agendador.

static void __cdecl Oversubscribe(bool _BeginOversubscription);

Parâmetros

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

ID do Grupo de Agenda

Devolve um identificador para o grupo de agendamento em que o contexto atual está a trabalhar.

static unsigned int __cdecl ScheduleGroupId();

Valor de retorno

Se o contexto atual estiver ligado a um agendador e a trabalhar num grupo de agendamento, um identificador para o grupo de agendadores em que o contexto atual está a trabalhar; caso contrário, o valor -1.

Desbloquear

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

virtual void Unblock() = 0;

Observações

É perfeitamente legal que uma chamada ao Unblock método venha antes de uma chamada correspondente ao método Block . Desde que as chamadas aos Block métodos e Unblock estejam devidamente emparelhadas, o runtime gere corretamente a raça natural de qualquer uma das ordens. Uma Unblock chamada que vem antes de uma Block chamada simplesmente anula o efeito da chamada Block .

Existem várias exceções que podem ser eliminadas deste método. Se um contexto tentar chamar o método Unblock em si próprio, uma exceção context_self_unblock será lançada. Se as chamadas para Block e Unblock não forem devidamente emparelhadas (por exemplo, se duas chamadas para Unblock forem feitas para um contexto que está atualmente em execução), será lançada uma exceção "context_unblock_unbalanced".

Tenha em atenção que existe um período crítico entre o momento em que o seu código publica o seu contexto para outro thread poder chamar o método Unblock e o momento em que é feita a chamada ao método Block. Durante este período, não deve chamar nenhum método que possa, por sua vez, bloquear e desbloquear por razões próprias (por exemplo, adquirir um bloqueio). As chamadas ao Block método e Unblock não rastreiam a razão do bloqueio e desbloqueio. Apenas um objeto deve ter propriedade sobre um par de Block e Unblock.

VirtualProcessorId

Devolve um identificador para o processador virtual onde o contexto atual está a ser executado.

static unsigned int __cdecl VirtualProcessorId();

Valor de retorno

Se o contexto atual estiver associado a um agendador, um identificador para o processador virtual onde o contexto atual está a ser executado; caso contrário, o valor -1.

Observações

O valor de retorno deste método é uma amostragem instantânea do processador virtual onde o contexto atual está a ser executado. Este valor pode ficar obsoleto no momento em que é devolvido e não pode ser confiável. Normalmente, este 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 outro contexto disponível para ceder, o escalonador pode ceder a outra linha de execução do sistema operativo.

static void __cdecl Yield();

Observações

Este método resultará na criação e/ou anexação do agendador padrão do processo ao contexto de chamada se não houver agendador atualmente associado ao contexto de chamada.

YieldExecution

Gera execução para que outro contexto possa ser executado. Se não houver outro contexto disponível para ceder, o escalonador pode ceder a outra linha de execução do sistema operativo.

static void __cdecl YieldExecution();

Observações

Este método resultará na criação e/ou anexação do agendador padrão do processo ao contexto de chamada se não houver agendador atualmente associado ao contexto de chamada.

Esta 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.

Consulte também

concorrência Namespace
Classe Scheduler
Agendador de Tarefas