Instâncias de agendador

Este documento descreve a função das instâncias de agendador no Runtime de Simultaneidade e como usar as classes concurrency::Scheduler e concurrency::CurrentScheduler para criar e gerenciar instâncias de agendador. As instâncias de 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 de agendador para executar algumas tarefas em uma prioridade de thread com privilégios elevados e usar o agendador padrão para executar outras tarefas na prioridade de thread normal.

Dica

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

Seções

As classes Scheduler e CurrentScheduler

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

Um thread anexado a um agendador é conhecido como um 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 Runtime de Simultaneidade usa a classe concurrency::CurrentScheduler para fornecer acesso ao agendador atual. O agendador atual de um contexto pode ser diferente do agendador atual de outro contexto. O runtime não fornece uma representação em nível de processo do agendador atual.

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

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

[Parte superior]

Criar uma instância de agendador

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

  • Se nenhum agendador existir, o runtime criará um agendador padrão para você quando você usar a funcionalidade de runtime, 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 objeto Scheduler que usa uma política específica e associa esse agendador ao contexto atual.

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

Permitir que o runtime 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 trabalhos paralelos. Portanto, você não precisa trabalhar diretamente com o agendador para controlar sua política ou tempo de vida. Quando você usa a PPL ou a Biblioteca de Agentes, o runtime 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 runtime o usa para agendar tarefas. Crie instâncias de agendador adicionais somente quando você 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.

[Parte superior]

Gerenciar o tempo de vida de uma instância de agendador

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

Quando você usa o método CurrentScheduler::Create ou o método Scheduler::Create para criar um objeto Scheduler, o runtime define a contagem de referência inicial desse agendador como um. O runtime incrementa a contagem de referência quando você chama o método concurrency::Scheduler::Attach. O método Scheduler::Attach associa o objeto Scheduler ao contexto atual. Isso o torna o agendador atual. Quando você chama o método CurrentScheduler::Create, o runtime cria um objeto Scheduler e o anexa ao contexto atual (e define 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 objeto Scheduler.

O runtime decrementa a contagem de referência quando você chama o método concurrency::CurrentScheduler::Detach para desanexar o agendador atual ou chamar o método concurrency::Scheduler::Release. Quando a contagem de referência atinge zero, o runtime destrói o objeto Scheduler 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 chegar a zero e uma tarefa incrementá-la, o runtime não destruirá o objeto Scheduler até que a contagem de referências atinja novamente zero e todas as tarefas sejam concluídas.

O runtime mantém uma pilha interna de objetos Scheduler para cada contexto. Quando você chama o método Scheduler::Attach ou CurrentScheduler::Create, o runtime envia esse objeto Scheduler para a pilha do contexto atual. Isso o torna o agendador atual. Quando você chama CurrentScheduler::Detach, o runtime remove o agendador atual da pilha do contexto atual e define o anterior como o agendador atual.

O runtime fornece várias maneiras de gerenciar o tempo de vida de uma instância de 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 Liberar ou desanexar método
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 runtime.

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

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

[Parte superior]

Métodos e Recursos

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

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

A tabela a seguir mostra os métodos importantes definidos pela classe CurrentScheduler.

Método Descrição
Criar Cria um objeto Scheduler que usa a política especificada e a associa ao contexto atual.
Get Recupera um ponteiro para o objeto Scheduler associado ao contexto atual. Esse método não incrementa a contagem de referência do objeto Scheduler.
Desanexar Desanexa o agendador atual do contexto atual e define o anterior como o agendador atual.
RegisterShutdownEvent Registra um evento que o runtime define quando o agendador atual é destruído.
CreateScheduleGroup Cria um objeto concurrency::ScheduleGroup no agendador atual.
ScheduleTask 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 definidos pela classe Scheduler.

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

[Parte superior]

Exemplo

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

Confira também

Agendador de Tarefas
Como gerenciar instâncias de agendador
Políticas de agendador
Grupos Agendados