Filas e tarefas em segundo plano em C++: escrevendo assincronia sem dor

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que seu programa está lento e como corrigir isso

\n\n

Imagine: você escreveu um parser incrível em C++ que precisa processar 10.000 URLs. Você o executa, vai tomar um café, volta — e ele ainda está carregando o primeiro site. Familiar? O problema é que o programa funciona de forma síncrona: enquanto uma requisição é executada, as outras esperam na fila, como em um supermercado soviético.

\n\n

No mundo moderno, os usuários não toleram atrasos. Se o servidor responde em mais de 200 ms — você perde clientes. Mas como fazer o C++ funcionar mais rápido sem reescrever tudo do zero? A resposta são filas e tarefas em segundo plano. Isso não é apenas um termo da moda, mas um padrão fundamental usado no kernel do Linux, em engines de jogos e serviços de alta carga.

\n\n

Neste artigo, vamos entender como funcionam as filas de tarefas em C++, escrever nosso próprio thread pool simples e aprender a processar dados em segundo plano sem condições de corrida e deadlocks. Pronto para turbinar seu código? Vamos lá.

\n\n

O que é uma fila de tarefas e para que serve

\n\n

Fila de tarefas (task queue) é uma estrutura de dados que funciona pelo princípio FIFO (First In, First Out). Imagine uma esteira: você adiciona tarefas em uma extremidade, e as threads executoras as retiram da outra. Esta é a base do padrão Producer-Consumer (produtor-consumidor).

\n\n

Para que isso serve em C++? Aqui estão três razões principais:

\n\n
    \n
  • Processamento paralelo — várias threads pegam tarefas da fila simultaneamente, acelerando o trabalho várias vezes.
  • \n
  • Assincronia — a thread principal não é bloqueada, continuando a receber novas requisições ou atualizar a interface.
  • \n
  • Balanceamento de carga — se uma tarefa é pesada, outras threads pegam as leves, e o sistema não trava.
  • \n
\n\n

Por exemplo, um servidor web em C++ pode colocar requisições HTTP recebidas em uma fila, e um pool de threads as processa em paralelo. Enquanto uma thread faz parsing de JSON, outra escreve no banco de dados — tudo sem bloquear o loop principal.

\n\n

Escrevendo uma fila simples em C++ do zero

\n\n

Vamos começar com um exemplo básico. Na biblioteca padrão do C++ existe std::queue, mas para multithreading precisamos encapsulá-la em uma classe protegida. Aqui está uma implementação mínima de uma fila thread-safe:

\n\n
#include <queue>\n#include <mutex>\n#include <condition_variable>\n#include <functional>\n#include <thread>\n\nclass ThreadSafeQueue {\nprivate:\n    std::queue<std::function<void()>> tasks;\n    std::mutex mtx;\n    std::condition_variable cv;\n\npublic:\n    void push(std::function<void()> task) {\n        std::lock_guard<std::mutex> lock(mtx);\n        tasks.push(task);\n        cv.notify_one();  // Acorda uma thread em espera\n    }\n\n    std::function<void()> pop() {\n        std::unique_lock<std::mutex> lock(mtx);\n        cv.wait(lock, [this] { return !tasks.empty(); });\n        auto task = tasks.front();\n        tasks.pop();\n        return task;\n    }\n};\n
\n\n

Aqui usamos std::mutex para proteger o acesso à fila e std::condition_variable para que as threads não desperdicem CPU esperando novas tarefas. Quando uma tarefa aparece, acordamos uma thread com notify_one().

\n\n

Mas isso é apenas metade do trabalho. Precisamos de um pool de threads (thread pool) que executará essas tarefas.

\n\n

Criando um pool de threads: o coração das tarefas em segundo plano

\n\n

Pool de threads é um conjunto de threads criadas previamente que aguardam trabalho. Em vez de criar e destruir threads para cada tarefa (o que é caro), nós as reutilizamos. Aqui está uma implementação clássica:

\n\n
class ThreadPool {\nprivate:\n    std::vector<std::thread> workers;\n    ThreadSafeQueue queue;\n    bool stop = false;\n\n    void worker_loop() {\n        while (!stop) {\n                

Blogs

Book Recommendations