0Pricing
C++ Academy · Aula

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ão
  • await_suspend(handle) — o que fazer enquanto estiver suspenso
  • await_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

  1. Conceitos de corrotinas: co_await, co_yield, co_return
  2. Implementar um gerador simples
  3. Tarefas assíncronas e tipos awaiter
  4. Alocação de quadros de corrotinas
← Voltar para C++ Academy