libuv para C++: guia completo com exemplos práticos

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

libuv para C++: Guia Completo de I/O Assíncrono

Bem-vindo ao guia completo sobre a biblioteca libuv para a linguagem C++. Este artigo foi criado para o portal educacional PythonLib e é destinado a desenvolvedores que desejam dominar a programação assíncrona em C++ usando uma das bibliotecas mais confiáveis e de alto desempenho disponíveis.

1. O que é libuv e por que usá-la?

libuv é uma biblioteca multiplataforma escrita em C, projetada para operações de entrada e saída (I/O) assíncronas. Originalmente desenvolvida para o projeto Node.js, ela abstrai o trabalho com o event loop (loop de eventos) e operações de I/O não bloqueantes em diferentes sistemas operacionais. Hoje, a libuv é usada não apenas no Node.js, mas também em projetos como Julia, Luvit, Pyuv (Python) e muitos outros.

Por que usá-la? Na programação moderna, é comum precisar executar várias tarefas simultaneamente sem bloquear o fluxo principal de execução. Abordagens tradicionais, como multithreading, são complexas de implementar e propensas a erros (condições de corrida, deadlocks). A libuv oferece uma alternativa elegante: um modelo assíncrono baseado em loop de eventos. Você registra handlers (callbacks) para diferentes eventos (leitura de socket, timer, sinal), e a libuv os chama automaticamente quando o evento ocorre, sem bloquear a execução de outras tarefas.

Para desenvolvedores C++, a libuv fornece uma ferramenta poderosa para criar servidores de rede de alto desempenho, clientes, ferramentas de manipulação de arquivos e utilitários de sistema. Ela lida com todo o trabalho de baixo nível com epoll (Linux), kqueue (macOS), IOCP (Windows) e outros mecanismos, oferecendo uma API única e simples. Isso permite escrever código que funciona em qualquer plataforma sem modificações.

2. Instalação da libuv

A instalação da libuv depende do seu sistema operacional e do gerenciador de pacotes utilizado. Como é uma biblioteca C, ela não é instalada via pip, npm ou cargo. Confira os principais métodos de instalação:

Linux (Ubuntu/Debian)

sudo apt update
sudo apt install libuv1-dev

macOS (Homebrew)

brew install libuv

Windows (vcpkg)

vcpkg install libuv

Compilação a partir do código-fonte (para todas as plataformas)

git clone https://github.com/libuv/libuv.git
cd libuv
mkdir build && cd build
cmake .. -DBUILD_TESTING=OFF
make -j$(nproc)
sudo make install

Após a instalação, você pode compilar seu programa vinculando a biblioteca:

g++ -std=c++11 -o meu_programa meu_programa.cpp -luv

3. Início rápido: Exemplo mínimo funcional

Vamos escrever um programa simples que cria um loop de eventos e dispara um timer que executa uma única vez após 1 segundo.

#include <uv.h>
#include <cstdio>

// Callback do timer
void on_timer(uv_timer_t* handle) {
    printf("Timer disparou!\n");
    // Para o loop de eventos
    uv_stop(handle->loop);
}

int main() {
    // 1. Cria o loop de eventos
    uv_loop_t* loop = uv_default_loop();

    // 2. Cria e inicializa o timer
    uv_timer_t timer;
    uv_timer_init(loop, &timer);

    // 3. Inicia o timer: dispara uma vez após 1000 ms
    uv_timer_start(&timer, on_timer, 1000, 0);

    // 4. Executa o loop de eventos
    printf("Iniciando o loop de eventos...\n");
    uv_run(loop, UV_RUN_DEFAULT);

    // 5. Libera os recursos
    uv_loop_close(loop);

    return 0;
}

Explicação:

  1. uv_default_loop() — obtém o loop de eventos global padrão.
  2. uv_timer_init() — inicializa a estrutura do timer.
  3. uv_timer_start() — inicia o timer com o callback, tempo de atraso e intervalo (0 = executa uma vez).
  4. uv_run() — executa o loop de eventos até que não haja mais handlers ativos.
  5. uv_loop_close() — libera os recursos alocados pelo loop.

Recommendations