Comando C++: condition_variable – Permite que um thread espere por uma condição ser satisfeita.

No mundo da programação em C++, a sincronização entre threads é uma preocupação fundamental para garantir o desempenho e a integridade dos dados. Uma das ferramentas disponíveis para esse fim é o condition_variable, que permite que um thread aguarde até que uma condição específica seja atendida. Neste artigo, exploraremos o uso do condition_variable no C++, destacando sua importância e como implementá-lo de forma eficaz em um ambiente de múltiplas threads.

Comando C++: Entendendo o uso de condition_variable

O condition_variable é uma classe da biblioteca padrão C++ que fornece um mecanismo de sincronização que permite que um ou mais threads esperem até que uma condição seja satisfeita. Ele funciona em conjunto com um mutex para proteger o acesso a recursos compartilhados. Quando um thread deseja esperar por uma condição, ele deve primeiro bloquear o mutex e, em seguida, chamar o método wait no condition_variable. Isso libera o mutex e coloca o thread em estado de espera. Quando a condição é finalmente satisfeita, outro thread pode notificar o condition_variable através do método notify_one ou notify_all, permitindo que o thread em espera seja ativado e continue sua execução.

Sincronização de Threads com condition_variable em C++

A seguir, apresentamos um exemplo simples de como utilizar o condition_variable para sincronização de threads em C++. Neste caso, um thread produtor gera dados que são consumidos por um thread consumidor. O consumidor aguarda até que dados estejam disponíveis para processar:

#include 
#include 
#include 
#include 

std::queue dataQueue;
std::mutex mtx;
std::condition_variable condVar;

void producer() {
    for (int i = 0; i < 10; ++i) {
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
        std::lock_guard lock(mtx);
        dataQueue.push(i);
        std::cout << "Produzido: " << i << std::endl;
        condVar.notify_one(); // Notifica o consumidor
    }
}

void consumer() {
    for (int i = 0; i < 10; ++i) {
        std::unique_lock lock(mtx);
        condVar.wait(lock, [] { return !dataQueue.empty(); }); // Espera até que a fila não esteja vazia
        int data = dataQueue.front();
        dataQueue.pop();
        std::cout << "Consumido: " << data << std::endl;
    }
}

int main() {
    std::thread t1(producer);
    std::thread t2(consumer);

    t1.join();
    t2.join();

    return 0;
}

Neste exemplo, o thread produtor adiciona números a uma fila, enquanto o thread consumidor aguarda até que a fila tenha dados disponíveis para processar. A utilização do condition_variable facilita a comunicação entre os threads, evitando o polling contínuo e garantindo que o consumidor não acesse a fila vazia.

Em suma, o condition_variable é uma ferramenta poderosa em C++ para a sincronização de threads, proporcionando uma maneira eficiente de gerenciar a espera por condições específicas. Ao combinar condition_variable com mutexes, os desenvolvedores podem construir aplicações multithreaded robustas e livres de condições de corrida. Através da prática e da compreensão de seu funcionamento, é possível aproveitar ao máximo essa funcionalidade para melhorar a eficiência e a segurança de suas aplicações.

Leia mais