Partilhar via


Instâncias do Agendador

Este documento descreve a função das instâncias do agendador no Concurrency Runtime e como usar as classes concurrency::Scheduler e concurrency::CurrentScheduler para criar e gerenciar instâncias do agendador. As instâncias do agendador são úteis quando você deseja associar políticas de agendamento explícitas a tipos específicos de cargas de trabalho. Por exemplo, você pode criar uma instância do agendador para executar algumas tarefas com uma prioridade de thread elevada e usar o agendador padrão para executar outras tarefas com a prioridade de thread normal.

Sugestão

O Concurrency Runtime fornece um agendador padrão e, portanto, você não é obrigado a criar um em seu aplicativo. Como o Agendador de Tarefas ajuda a ajustar o desempenho de seus aplicativos, recomendamos que você comece com a Biblioteca de Padrões Paralelos (PPL) ou a Biblioteca de Agentes Assíncronos se você for novo no Tempo de Execução de Simultaneidade.

Secções

Classes Scheduler e CurrentScheduler

O Agendador de Tarefas permite que os aplicativos usem uma ou mais instâncias do Agendador para agendar o trabalho. A classe concurrency::Scheduler representa uma instância do agendador e encapsula a funcionalidade relacionada ao agendamento de tarefas.

Uma thread ligada a um agendador é conhecida como contexto de execução ou apenas contexto. Um agendador pode estar ativo no contexto atual a qualquer momento. O agendador ativo também é conhecido como o agendador atual. O Concurrency Runtime usa a classe concurrency::CurrentScheduler para fornecer acesso ao agendador atual. O agendador atual para um contexto pode diferir do agendador atual para outro contexto. O tempo de execução não fornece uma representação ao nível de processo do agendador atual.

Normalmente, a CurrentScheduler classe é usada para acessar o agendador atual. A Scheduler classe é útil quando você precisa gerenciar um agendador que não é o atual.

As seções a seguir descrevem como criar e gerenciar uma instância do agendador. Para obter um exemplo completo que ilustra essas tarefas, consulte Como gerenciar uma instância do Scheduler.

[Topo]

Criando uma instância do Scheduler

Há estas três maneiras de criar um Scheduler objeto:

  • Se nenhum agendador existir, o tempo de execução criará um agendador padrão para você quando você usar a funcionalidade de tempo de execução, por exemplo, um algoritmo paralelo, para executar o trabalho. O agendador padrão torna-se o agendador atual para o contexto que inicia o trabalho paralelo.

  • O método concurrency::CurrentScheduler::Create cria um Scheduler objeto que usa uma política específica e associa esse agendador ao contexto atual.

  • O método concurrency::Scheduler::Create cria um Scheduler objeto que usa uma política específica, mas não o associa ao contexto atual.

Permitir que o tempo de execução crie um agendador padrão permite que todas as tarefas simultâneas compartilhem o mesmo agendador. Normalmente, a funcionalidade fornecida pela biblioteca de padrões paralelos (PPL) ou pela biblioteca de agentes assíncronos é usada para executar trabalho paralelo. Não é necessário trabalhar diretamente com o agendador para controlar a sua política ou duração. Quando você usa o PPL ou a Biblioteca de agentes, o tempo de execução cria o agendador padrão se ele não existir e o torna o agendador atual para cada contexto. Quando você cria um agendador e o define como o agendador atual, o tempo de execução usa esse agendador para agendar tarefas. Crie instâncias de agendador adicionais somente quando precisar de uma política de agendamento específica. Para obter mais informações sobre as políticas associadas a um agendador, consulte Políticas do Agendador.

[Topo]

Gerir o ciclo de vida de uma instância do Scheduler

O tempo de execução usa um mecanismo de contagem de referência para controlar o tempo de vida dos Scheduler objetos.

Quando você usa o CurrentScheduler::Create método ou o Scheduler::Create método para criar um Scheduler objeto, o tempo de execução define a contagem de referência inicial desse agendador para um. O tempo de execução incrementa a contagem de referência quando o utilizador chama o método concurrency::Scheduler::Attach. O Scheduler::Attach método associa o Scheduler objeto com o contexto atual. Isso o torna o agendador atual. Quando se chama o método CurrentScheduler::Create, o ambiente de execução cria um objeto Scheduler e anexa-o ao contexto atual (definindo a contagem de referência como um). Você também pode usar o método concurrency::Scheduler::Reference para incrementar a contagem de referência de um Scheduler objeto.

O tempo de execução diminui a contagem de referência quando você chama o método concurrency::CurrentScheduler::D etach para desanexar o agendador atual ou chama o método concurrency::Scheduler::Release . Quando a contagem de referência atinge zero, o tempo de execução destrói o Scheduler objeto após a conclusão de todas as tarefas agendadas. Uma tarefa em execução tem permissão para incrementar a contagem de referência do agendador atual. Portanto, se a contagem de referência atingir zero e uma tarefa incrementar a contagem de referência, o tempo de execução não destruirá o Scheduler objeto até que a contagem de referência atinja novamente zero e todas as tarefas sejam concluídas.

O tempo de execução mantém uma pilha interna de Scheduler objetos para cada contexto. Quando chamas o método Scheduler::Attach ou CurrentScheduler::Create, o ambiente de execução envia esse objeto Scheduler para a pilha no contexto atual. Isso o torna o agendador atual. Quando chama CurrentScheduler::Detach, o tempo de execução remove o agendador atual da pilha para o contexto atual e define o anterior como o novo agendador.

O tempo de execução fornece várias maneiras de gerenciar o tempo de vida de uma instância do agendador. A tabela a seguir mostra o método apropriado que libera ou desanexa o agendador do contexto atual para cada método que cria ou anexa um agendador ao contexto atual.

Criar ou anexar método Método de liberação ou desanexação
CurrentScheduler::Create CurrentScheduler::Detach
Scheduler::Create Scheduler::Release
Scheduler::Attach CurrentScheduler::Detach
Scheduler::Reference Scheduler::Release

Chamar o método de liberação ou desanexação inadequado produz um comportamento não especificado no tempo de execução.

Quando você usa a funcionalidade, por exemplo, o PPL, que faz com que o tempo de execução crie o agendador padrão para você, não libere ou desanexe esse agendador. O tempo de execução gerencia o tempo de vida de qualquer agendador que ele cria.

Como o tempo de execução não destrói um Scheduler objeto antes de todas as tarefas terem terminado, você pode usar o método concurrency::Scheduler::RegisterShutdownEvent ou o método concurrency::CurrentScheduler::RegisterShutdownEvent para receber uma notificação quando um Scheduler objeto for destruído. Isso é útil quando você deve aguardar a conclusão de cada tarefa agendada por um Scheduler objeto.

[Topo]

Métodos e Características

Esta seção resume os métodos importantes das CurrentScheduler classes e Scheduler .

Pense na CurrentScheduler classe como um auxiliar para criar um agendador para uso no contexto atual. A Scheduler classe permite controlar um agendador que pertence a outro contexto.

A tabela a seguir mostra os métodos importantes que são definidos pela CurrentScheduler classe.

Método Descrição
Criar Cria um Scheduler objeto que usa a política especificada e a associa ao contexto atual.
Obter Recupera um ponteiro para o objeto Scheduler associado ao contexto atual. Este método não incrementa a contagem de referência do Scheduler objeto.
Destacar Desanexa o agendador atual do contexto atual e define o anterior como o agendador atual.
RegisterShutdownEvent Registra um evento que o tempo de execução define quando o agendador atual é destruído.
CreateScheduleGroup Cria um objeto concurrency::ScheduleGroup no scheduler atual.
TarefaAgendada Adiciona uma tarefa leve à fila de agendamento do agendador atual.
GetPolicy Recupera uma cópia da política associada ao agendador atual.

A tabela a seguir mostra os métodos importantes que são definidos pela Scheduler classe.

Método Descrição
Criar Cria um Scheduler objeto que usa a política especificada.
Anexar Associa o Scheduler objeto ao contexto atual.
Referência Incrementa o contador de referência do Scheduler objeto.
Lançamento Decrementa o contador de referência do objeto Scheduler.
RegisterShutdownEvent Registra um evento que o tempo de execução define quando o Scheduler objeto é destruído.
CreateScheduleGroup Cria um objeto concurrency::ScheduleGroup no Scheduler objeto.
TarefaAgendada Programa uma tarefa leve a partir do Scheduler objeto.
GetPolicy Recupera uma cópia da política associada ao Scheduler objeto.
SetDefaultSchedulerPolicy Define a política para o tempo de execução a ser usado quando ele cria o agendador padrão.
ResetDefaultSchedulerPolicy Restaura a política padrão para a que estava ativa antes da chamada para SetDefaultSchedulerPolicy. Se o agendador padrão for criado após essa chamada, o tempo de execução usará as configurações de diretiva padrão para criar o agendador.

[Topo]

Exemplo

Para obter exemplos básicos de como criar e gerenciar uma instância do agendador, consulte Como gerenciar uma instância do agendador.

Ver também

Agendador de Tarefas
Como gerenciar uma instância do Scheduler
Políticas do Scheduler
Agendar Grupos