Classe structured_task_group
A classe structured_task_group
representa uma coleção altamente estruturada de trabalho paralelo. Você pode enfileirar tarefas paralelas individuais para um structured_task_group
usando objetos task_handle
e aguardar a conclusão deles ou cancelar o grupo de tarefas antes que eles terminem de executar, o que anulará todas as tarefas que não iniciaram a execução.
Sintaxe
class structured_task_group;
Membros
Construtores públicos
Nome | Descrição |
---|---|
structured_task_group | Sobrecarregado. Constrói um novo objeto structured_task_group . |
Destruidor ~structured_task_group | Destrói um objeto structured_task_group . Espera-se que você chame o método wait ou run_and_wait no objeto antes da execução do destruidor, a menos que o destruidor esteja sendo executado como resultado do desenrolamento da pilha devido a uma exceção. |
Métodos públicos
Nome | Descrição |
---|---|
cancel | Tenta ao máximo cancelar a subárvore do trabalho com raiz nesse grupo de tarefas. Toda tarefa agendada no grupo de tarefas será cancelada transitivamente, se possível. |
is_canceling | Informa ao chamador se o grupo de tarefas está no meio de um cancelamento. Isso não indica necessariamente que o método cancel foi chamado no objeto structured_task_group (embora isso certamente qualifique esse método a retornar true ). Pode ser o caso de o objeto structured_task_group estar executando em linha e um grupo de tarefas mais acima na árvore de trabalho foi cancelado. Em casos como esses em que o runtime pode determinar antecipadamente que o cancelamento fluirá por esse objeto structured_task_group , true também será retornado. |
run | Sobrecarregado. Agenda uma tarefa no objeto structured_task_group . O chamador gerencia o tempo de vida do objeto task_handle passado no parâmetro _Task_handle . A versão que usa o parâmetro _Placement faz com que a tarefa seja desviada para execução no local especificado por esse parâmetro. |
run_and_wait | Sobrecarregado. Agenda uma tarefa a ser executada em linha no contexto de chamada com a assistência do objeto structured_task_group para suporte completo ao cancelamento. Se um objeto task_handle for passado como um parâmetro para run_and_wait , o chamador será responsável por gerenciar o tempo de vida do objeto task_handle . Em seguida, a função aguarda até que todo o trabalho no objeto structured_task_group tenha sido concluído ou cancelado. |
wait | Aguarda até que todo o trabalho no structured_task_group tenha sido concluído ou seja cancelado. |
Comentários
Há várias restrições severas impostas ao uso de um objeto structured_task_group
para ganhar desempenho:
Um único objeto
structured_task_group
não pode ser usado por vários threads. Todas as operações em um objetostructured_task_group
devem ser executadas pelo thread que criou o objeto. As duas exceções a essa regra são as funções membrocancel
eis_canceling
. O objeto pode não estar na lista de captura de uma expressão lambda e ser usado dentro de uma tarefa, a menos que a tarefa esteja usando uma das operações de cancelamento.Todas as tarefas agendadas para um objeto
structured_task_group
são agendadas por meio do uso de objetostask_handle
dos quais você deve gerenciar explicitamente o tempo de vida.Vários grupos só podem ser usados em ordem completamente aninhada. Se dois objetos
structured_task_group
forem declarados, o segundo sendo declarado (o interno) deverá se destruir antes de qualquer método, exceto secancel
ouis_canceling
for chamado no primeiro (o externo). Essa condição se mantém verdadeira no caso de simplesmente declarar vários objetosstructured_task_group
dentro dos mesmos escopos ou funcionalmente aninhados, bem como no caso de uma tarefa que foi enfileirada para ostructured_task_group
por meio dos métodosrun
ourun_and_wait
.Ao contrário da classe geral
task_group
, todos os estados da classestructured_task_group
são finais. Depois de enfileirar tarefas no grupo e esperar que elas sejam concluídas, talvez você não use o mesmo grupo novamente.
Para saber mais, confira Paralelismo da tarefa.
Hierarquia de herança
structured_task_group
Requisitos
Cabeçalho: ppl.h
Namespace: concurrency
cancel
Tenta ao máximo cancelar a subárvore do trabalho com raiz nesse grupo de tarefas. Toda tarefa agendada no grupo de tarefas será cancelada transitivamente, se possível.
void cancel();
Comentários
Para obter mais informações, consulte Cancelamento.
is_canceling
Informa ao chamador se o grupo de tarefas está no meio de um cancelamento. Isso não indica necessariamente que o método cancel
foi chamado no objeto structured_task_group
(embora isso certamente qualifique esse método a retornar true
). Pode ser o caso de o objeto structured_task_group
estar executando em linha e um grupo de tarefas mais acima na árvore de trabalho foi cancelado. Em casos como esses em que o runtime pode determinar antecipadamente que o cancelamento fluirá por esse objeto structured_task_group
, true
também será retornado.
bool is_canceling();
Valor de retorno
Uma indicação de se o objeto structured_task_group
está no meio de um cancelamento (ou se é garantido que esteja em breve).
Comentários
Para obter mais informações, consulte Cancelamento.
run
Agenda uma tarefa no objeto structured_task_group
. O chamador gerencia o tempo de vida do objeto task_handle
passado no parâmetro _Task_handle
. A versão que usa o parâmetro _Placement
faz com que a tarefa seja desviada para execução no local especificado por esse parâmetro.
template<class _Function>
void run(
task_handle<_Function>& _Task_handle);
template<class _Function>
void run(
task_handle<_Function>& _Task_handle,
location& _Placement);
Parâmetros
_Function
O tipo do objeto de função que será invocado para executar o corpo do identificador de tarefa.
_Task_handle
Um identificador para o trabalho que está sendo agendado. Observe que o chamador é responsável pelo tempo de vida deste objeto. O runtime continuará a esperar que ele viva até que o método wait
ou run_and_wait
tenha sido chamado neste objeto structured_task_group
.
_Placement
Uma referência ao local em que a tarefa representada pelo parâmetro _Task_handle
deve ser executada.
Comentários
O runtime cria uma cópia da função de trabalho que você passa para este método. Todas as alterações de estado que ocorrem em um objeto de função que você passa para esse método não aparecerão na cópia desse objeto de função.
Se o structured_task_group
se destruir como resultado do desenrolamento da pilha de uma exceção, você não precisará garantir que uma chamada tenha sido feita para o método wait
ou run_and_wait
. Nesse caso, o destruidor cancelará e aguardará a conclusão da tarefa representada pelo parâmetro _Task_handle
.
Gera uma exceção invalid_multiple_scheduling se o identificador de tarefa fornecido pelo parâmetro _Task_handle
já tiver sido agendado em um objeto de grupo de tarefas por meio do método run
e não houver nenhuma chamada intervindo para o método wait
ou run_and_wait
nesse grupo de tarefas.
run_and_wait
Agenda uma tarefa a ser executada em linha no contexto de chamada com a assistência do objeto structured_task_group
para suporte completo ao cancelamento. Se um objeto task_handle
for passado como um parâmetro para run_and_wait
, o chamador será responsável por gerenciar o tempo de vida do objeto task_handle
. Em seguida, a função aguarda até que todo o trabalho no objeto structured_task_group
tenha sido concluído ou cancelado.
template<class _Function>
task_group_status run_and_wait(task_handle<_Function>& _Task_handle);
template<class _Function>
task_group_status run_and_wait(const _Function& _Func);
Parâmetros
_Function
O tipo do objeto de função que será invocado para executar a tarefa.
_Task_handle
Um identificador da tarefa que será executada em linha no contexto de chamada. Observe que o chamador é responsável pelo tempo de vida deste objeto. O runtime continuará esperando que ele viva até que o método run_and_wait
conclua a execução.
_Func
Uma função que será chamada para invocar o corpo do trabalho. Isso pode ser um lambda ou outro objeto que dá suporte a uma versão do operador de chamada de função com a assinatura void operator()()
.
Valor de retorno
Uma indicação de se a espera foi atendida ou se o grupo de tarefas foi cancelado devido a uma operação de cancelamento explícita ou uma exceção sendo lançada de uma das tarefas. Para saber mais, consulte task_group_status
Comentários
Observe que uma ou mais das tarefas agendadas para esse objeto structured_task_group
podem ser executadas em linha no contexto de chamada.
Se uma ou mais das tarefas agendadas para esse objeto structured_task_group
gerar uma exceção, o runtime selecionará uma dessas exceções e a propagará da chamada para o método run_and_wait
.
Depois que essa função retorna, o objeto structured_task_group
é considerado em um estado final e não deve ser usado. Observe que a utilização após o retorno do método run_and_wait
resultará em um comportamento indefinido.
No caminho não excepcional de execução, você tem um mandato para chamar esse método ou o método wait
antes que o destruidor do structured_task_group
seja executado.
structured_task_group
Constrói um novo objeto structured_task_group
.
structured_task_group();
structured_task_group(cancellation_token _CancellationToken);
Parâmetros
_CancellationToken
Um token de cancelamento a ser associado a esse grupo de tarefas estruturado. O grupo de tarefas estruturado será cancelado quando o token for cancelado.
Comentários
O construtor que usa um token de cancelamento cria um structured_task_group
que será cancelado quando a fonte associada ao token for cancelada. Fornecer um token de cancelamento explícito também impede esse grupo de tarefas estruturado de participar de um cancelamento implícito de um grupo pai com um token diferente ou nenhum token.
~ structured_task_group
Destrói um objeto structured_task_group
. Espera-se que você chame o método wait
ou run_and_wait
no objeto antes da execução do destruidor, a menos que o destruidor esteja sendo executado como resultado do desenrolamento da pilha devido a uma exceção.
~structured_task_group();
Comentários
Se o destruidor for executado como resultado da execução normal (por exemplo, não desenrolar a pilha devido a uma exceção) e os métodos wait
ou run_and_wait
não tiverem sido chamados, o destruidor poderá gerar uma exceção missing_wait.
wait
Aguarda até que todo o trabalho no structured_task_group
tenha sido concluído ou seja cancelado.
task_group_status wait();
Valor de retorno
Uma indicação de se a espera foi atendida ou se o grupo de tarefas foi cancelado devido a uma operação de cancelamento explícita ou uma exceção sendo lançada de uma das tarefas. Para saber mais, consulte task_group_status
Comentários
Observe que uma ou mais das tarefas agendadas para esse objeto structured_task_group
podem ser executadas em linha no contexto de chamada.
Se uma ou mais das tarefas agendadas para esse objeto structured_task_group
gerar uma exceção, o runtime selecionará uma dessas exceções e a propagará da chamada para o método wait
.
Depois que essa função retorna, o objeto structured_task_group
é considerado em um estado final e não deve ser usado. Observe que a utilização após o retorno do método wait
resultará em um comportamento indefinido.
No caminho não excepcional de execução, você tem um mandato para chamar esse método ou o método run_and_wait
antes que o destruidor do structured_task_group
seja executado.
Confira também
Namespace de simultaneidade
Classe task_group
Classe task_handle