Compartilhar via


Classe Agendador

Representa uma abstração para um agendador do Concurrency Runtime.

Sintaxe

class Scheduler;

Membros

Construtores Protegidos

Nome Descrição
Agendador Um objeto da classe Scheduler só pode ser criado usando métodos de fábrica ou implicitamente.
~Destrutor do Agendador Um objeto da classe Scheduler é implicitamente destruído quando todas as referências externas a ela deixam de existir.

Métodos públicos

Nome Descrição
Attach Anexa o agendador ao contexto de chamada. Depois que esse método retorna, o contexto de chamada é gerido pelo agendador, e o agendador se torna o agendador atual.
Criar Cria um novo agendador cujo comportamento é descrito pelo parâmetro _Policy, coloca uma referência inicial no agendador e retorna um ponteiro para ele.
CreateScheduleGroup Sobrecarregado. Cria um novo grupo de agendamento dentro do agendador. A versão que usa o parâmetro _Placement faz com que as tarefas dentro do grupo agendado que acaba de ser criado sejam tendenciosas em relação à execução no local especificado por esse parâmetro.
GetNumberOfVirtualProcessors Retorna o número atual de processadores virtuais para o agendador.
GetPolicy Retorna uma cópia da política com a qual o agendador foi criado.
Id Retorna um identificador exclusivo do agendador.
IsAvailableLocation Determina se um determinado local está disponível no agendador.
Referência Incrementa a contagem de referências do grupo agendado.
RegisterShutdownEvent Faz com que o identificador de evento do Windows que é passado no parâmetro _Event seja sinalizado quando o agendador for encerrado e seja destruído. No momento em que o evento é sinalizado, todo o trabalho que tinha sido agendado pelo agendador está concluído. Vários eventos de desligamento podem ser registrados por meio desse método.
Versão Decrementa a contagem de referência do agendador.
ResetDefaultSchedulerPolicy Redefine a política de agendador padrão para o padrão de runtime. Na próxima vez que um agendador padrão for criado, ele usará as configurações de política padrão do runtime.
ScheduleTask Sobrecarregado. Agenda uma tarefa leve dentro do agendador. A tarefa leve será colocada em um grupo de agendamento determinado pelo runtime. A versão que usa o parâmetro _Placement faz com que a tarefa seja tendenciosa em relação à execução no local especificado.
SetDefaultSchedulerPolicy Permite que uma política definida pelo usuário seja usada para criar o agendador padrão. Esse método só pode ser chamado quando nenhum agendador padrão existe dentro do processo. Depois que uma política padrão for definida, ela permanecerá em vigor até a próxima chamada válida para o método SetDefaultSchedulerPolicy ou o ResetDefaultSchedulerPolicy.

Comentários

O agendador do Tempo de Execução Conjunto usa contextos de execução, que são mapeados para os contextos de execução do sistema operacional, como um thread, para executar o trabalho enfileirado pelo seu aplicativo. 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 Runtime de Simultaneidade criará um agendador padrão por processo para executar um trabalho paralelo. Além disso, você pode criar suas próprias instâncias de agendador e manipulá-las usando essa classe.

Hierarquia de herança

Scheduler

Requisitos

Cabeçalho: concrt.h

Namespace: simultaneidade

Anexar

Anexa o agendador ao contexto de chamada. Depois que esse método retorna, o contexto de chamada é gerido pelo agendador, e o agendador se torna o agendador atual.

virtual void Attach() = 0;

Comentários

Anexar um agendador coloca implicitamente uma referência no agendador.

Em determinado momento no futuro, você deve chamar o método CurrentScheduler::Detach para permitir o desligamento do agendador.

Se esse método for chamado de um contexto que já está anexado a um agendador diferente, o agendador existente será lembrado como o agendador anterior e o agendador que acaba de ser criado passará a ser o agendador atual. Quando você chama o método CurrentScheduler::Detach em um ponto posterior, o agendador anterior é restaurado como o agendador atual.

Esse método gerará uma exceção improper_scheduler_attach se esse agendador for o agendador atual do contexto de chamada.

Criar

Cria um novo agendador cujo comportamento é descrito pelo parâmetro _Policy, coloca uma referência inicial no agendador e retorna um ponteiro para ele.

static Scheduler* __cdecl Create(const SchedulerPolicy& _Policy);

Parâmetros

_Política
A política do agendador que descreve o comportamento do agendador recém-criado.

Valor de retorno

Um ponteiro para um agendador recém-criado. Esse objeto Scheduler tem uma contagem de referência inicial atribuída a ele.

Comentários

Depois que um agendador for criado com o método Create, você deverá chamar o método Release em algum momento no futuro para remover a contagem de referência inicial e permitir que o agendador seja desligado.

Um agendador criado com esse método não está anexado ao contexto de chamada. Ele pode ser anexado a um contexto usando o método Anexar.

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

CreateScheduleGroup

Cria um novo grupo de agendamento dentro do agendador. A versão que usa o parâmetro _Placement faz com que as tarefas dentro do grupo agendado que acaba de ser criado sejam tendenciosas em relação à execução no local especificado por esse parâmetro.

virtual ScheduleGroup* CreateScheduleGroup() = 0;

virtual ScheduleGroup* CreateScheduleGroup(location& _Placement) = 0;

Parâmetros

_Posicionamento
Uma referência a um local onde as tarefas dentro do grupo agendado terão preferência para serem executadas.

Valor de retorno

Um ponteiro para o grupo de agendamento que acaba de ser criado. Esse objeto ScheduleGroup possui uma contagem de referência inicial atribuída a ele.

Comentários

Você deve invocar o método Release em um grupo agendado quando terminar de agendar o trabalho para ele. O agendador destruirá o grupo de agendamento quando todo o trabalho enfileirado tiver sido concluído.

Observe que, se você criou explicitamente esse agendador, deverá liberar todas as referências aos grupos de agendamento dentro dele antes de liberar sua referência no agendador.

ObterNúmeroDeProcessadoresVirtuais

Retorna o número atual de processadores virtuais para o agendador.

virtual unsigned int GetNumberOfVirtualProcessors() const = 0;

Valor de retorno

O número atual de processadores virtuais para o agendador.

GetPolicy

Retorna uma cópia da política com a qual o agendador foi criado.

virtual SchedulerPolicy GetPolicy() const = 0;

Valor de retorno

Uma cópia da política com a qual o agendador foi criado.

ID

Retorna um identificador exclusivo do agendador.

virtual unsigned int Id() const = 0;

Valor de retorno

Um identificador exclusivo do agendador.

localizaçãoDisponível

Determina se um determinado local está disponível no agendador.

virtual bool IsAvailableLocation(const location& _Placement) const = 0;

Parâmetros

_Posicionamento
Uma referência ao local sobre o qual consultar o agendador.

Valor de retorno

Uma indicação de se o local especificado pelo argumento _Placement está disponível no agendador.

Comentários

Observe que o valor retornado é uma amostragem instantânea de se o local determinado está disponível. Na presença de vários agendadores, o gerenciamento de recursos dinâmicos pode adicionar ou remover recursos de agendadores a qualquer momento. Se isso acontecer, o local determinado poderá alterar a disponibilidade.

Referência

Incrementa a contagem de referências do grupo agendado.

virtual unsigned int Reference() = 0 ;

Valor de retorno

A contagem de referências incrementada recentemente.

Comentários

Normalmente, isso é usado para o gerenciamento do tempo de vida do agendador de composição. Quando a contagem de referência de um agendador cair para zero, o agendador será desligado e se destruirá após a conclusão de todo o trabalho no agendador.

O método gerará uma exceção improper_scheduler_reference se a contagem de referência antes de chamar o Reference método for zero e a chamada for feita a partir de um contexto que não pertence ao agendador.

RegisterShutdownEvent

Faz com que o identificador de evento do Windows que é passado no parâmetro _Event seja sinalizado quando o agendador for encerrado e seja destruído. No momento em que o evento é sinalizado, todo o trabalho que tinha sido agendado pelo agendador está concluído. Vários eventos de desligamento podem ser registrados por meio desse método.

virtual void RegisterShutdownEvent(HANDLE _Event) = 0;

Parâmetros

_Event
Um identificador para um objeto de evento do Windows que será sinalizado pelo runtime quando o agendador for desligado e destruído.

Lançamento

Decrementa a contagem de referência do agendador.

virtual unsigned int Release() = 0;

Valor de retorno

A contagem de referências decrementada recentemente.

Comentários

Normalmente, isso é usado para gerenciar o tempo de vida do agendador para composição. Quando a contagem de referência de um agendador cair para zero, o agendador será desligado e se destruirá após a conclusão de todo o trabalho no agendador.

RedefinirPolíticaPadrãoDoAgendador

Redefine a política de agendador padrão para o padrão de runtime. Na próxima vez que um agendador padrão for criado, ele usará as configurações de política padrão do runtime.

static void __cdecl ResetDefaultSchedulerPolicy();

Comentários

Esse método pode ser chamado enquanto um agendador padrão existe dentro do processo. Isso não afetará a política do agendador padrão existente. No entanto, se o agendador padrão fosse desligado e um novo padrão fosse criado posteriormente, o novo agendador usaria as configurações de política padrão do runtime.

Agendador

Um objeto da classe Scheduler só pode ser criado usando métodos de fábrica ou implicitamente.

Scheduler();

Comentários

O agendador padrão do processo é criado implicitamente quando você utiliza muitas das funções de runtime que exigem que um agendador seja anexado ao contexto de chamada. Métodos dentro da classe CurrentScheduler e funcionalidades das camadas PPL e de agentes normalmente realizam anexação implícita.

Você também pode criar um agendador explicitamente por meio do método CurrentScheduler::Create ou do método Scheduler::Create.

~Agendador

Um objeto da classe Scheduler é implicitamente destruído quando todas as referências externas a ela deixam de existir.

virtual ~Scheduler();

Agendar Tarefa

Agenda uma tarefa leve dentro do agendador. A tarefa leve será colocada em um grupo de agendamento determinado pelo runtime. A versão que usa o parâmetro _Placement faz com que a tarefa seja tendenciosa em relação à execução no local especificado.

virtual void ScheduleTask(
    TaskProc _Proc,
    _Inout_opt_ void* _Data) = 0;

virtual void ScheduleTask(
    TaskProc _Proc,
    _Inout_opt_ void* _Data,
    location& _Placement) = 0;

Parâmetros

_Proc
Um ponteiro para a função a ser usada para executar o corpo da tarefa de baixa carga.

_Data
Um ponteiro nulo para os dados que serão transmitidos como um parâmetro ao corpo da tarefa.

_Posicionamento
Uma referência a um local para o qual a atividade leve terá preferência em ser executada.

DefinirPolíticaPadrãoDeAgendador

Permite que uma política definida pelo usuário seja usada para criar o agendador padrão. Esse método só pode ser chamado quando nenhum agendador padrão existe dentro do processo. Depois que uma política padrão for definida, ela permanecerá em vigor até a próxima chamada válida para o método SetDefaultSchedulerPolicy ou o ResetDefaultSchedulerPolicy.

static void __cdecl SetDefaultSchedulerPolicy(const SchedulerPolicy& _Policy);

Parâmetros

_Política
A política a ser definida como a política de agendador padrão.

Comentários

Se o método SetDefaultSchedulerPolicy for chamado quando um agendador padrão já existir dentro do processo, o runtime lançará uma exceção default_scheduler_exists.

Confira também

Namespace de concorrência
Classe Scheduler
PolicyElementKey
Agendador de Tarefas