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.