Tarefas assíncronas e tipos awaiter
Componha tarefas assíncronas com tipos awaiter e promise personalizados
Tarefas assíncronas e tipos awaiter é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.
Corrotinas assíncronas
Uma tarefa assíncrona é suspensa durante a E/S e retomada quando a operação é concluída. Combine co_await com APIs assíncronas para escrever código assíncrono sem funções de retorno.
Esboço do tipo Task
Uma Task encapsula uma corrotina assíncrona. Ela oferece suporte a co_await para encadeamento.
template <typename T>
struct Task {
struct promise_type;
std::coroutine_handle<promise_type> handle;
// ...
};Mecânica de co_await
Quando o compilador encontra co_await expr, ele espera que expr seja um objeto aguardável. Um objeto aguardável tem três métodos:
await_ready()— false para suspender, true para ignorar a suspensãoawait_suspend(handle)— o que fazer enquanto estiver suspensoawait_resume()— valor a ser fornecido ao código chamador
Exemplo de objeto aguardável: Sleep
Um objeto aguardável que agenda uma retomada após um atraso.
struct Sleep {
std::chrono::milliseconds duration;
bool await_ready() const { return false; }
void await_suspend(std::coroutine_handle<> h) {
std::thread([h, this] {
std::this_thread::sleep_for(duration);
h.resume();
}).detach();
}
void await_resume() {}
};
Task<void> example() {
co_await Sleep{500ms};
std::cout << "after 500ms";
}Objeto aguardável para HTTP
Bibliotecas fornecem objetos aguardáveis para solicitações HTTP, temporizadores e E/S de arquivos. Componha-os como chamadas síncronas.
Task<std::string> fetch() {
auto data = co_await http_get("/api/data");
co_return data;
}Composição de tarefas
Aguardar uma tarefa dentro de outra as encadeia. A tarefa externa é suspensa até que a interna termine.
Task<int> outer() {
int x = co_await inner_a();
int y = co_await inner_b();
co_return x + y;
}Tarefas paralelas
Para realizar trabalho assíncrono em paralelo, inicie as tarefas sem aguardar cada uma imediatamente e depois aguarde todas.
Task<int> sum_tasks() {
auto a = inner_a();
auto b = inner_b();
int x = co_await a;
int y = co_await b;
co_return x + y;
}Propagação de exceções
Exceções lançadas dentro de uma tarefa assíncrona podem ser capturadas em unhandled_exception da promessa e relançadas no lado do aguardador.
Cancelamento
A biblioteca padrão ainda não fornece uma primitiva de cancelamento. As bibliotecas (cppcoro, boost.cobalt) criam suas próprias — normalmente por meio de tokens de cancelamento ou fontes de parada.
Integração com Boost.Asio
O Asio oferece suporte nativo a corrotinas. Use co_await em async_read, async_write e operações semelhantes. Atualmente, é a forma mais limpa de fazer E/S assíncrona em C++.
Desempenho
Retomar uma corrotina é muito mais barato que trocar de linha de execução. O compilador frequentemente expande partes da máquina de estados em linha. Faça um perfil para verificar se sua cadeia de objetos aguardáveis é compilada corretamente.
Direções futuras
O C++23 adicionou std::generator e outras melhorias. O C++26 poderá trazer std::execution (remetente/receptor) — uma estrutura assíncrona mais geral que interoperará com corrotinas.
Verificação rápida
Quais três métodos um tipo aguardável precisa ter?
Recapitulação
As tarefas assíncronas combinam co_await com objetos aguardáveis para escrever código assíncrono sem funções de retorno. Os objetos aguardáveis têm await_ready, await_suspend e await_resume. As bibliotecas (cppcoro, Asio) fornecem tipos prontos de tarefas e objetos aguardáveis.
Perguntas Frequentes
A aula “Tarefas assíncronas e tipos awaiter” é grátis?
Sim — o texto completo de “Tarefas assíncronas e tipos awaiter” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.
O que vou aprender em “Tarefas assíncronas e tipos awaiter”?
Componha tarefas assíncronas com tipos awaiter e promise personalizados Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C++ Academy?
Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Tarefas assíncronas e tipos awaiter”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C++ Academy?
Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Conceitos de corrotinas: co_await, co_yield, co_return
- Implementar um gerador simples
- Tarefas assíncronas e tipos awaiter
- Alocação de quadros de corrotinas