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