Sobes.tech
Junior — Middle

Wyjaśnij cel i działanie std::condition_variable w C++.

sobes.tech AI

Odpowiedź od AI

std::condition_variable w C++ jest używany do organizacji synchronizacji między wątkami. Pozwala jednemu lub wielu wątkom oczekiwać na wystąpienie określonego zdarzenia, jednocześnie zwalniając mutex, aby inne wątki mogły zmienić stan, na który czeka pierwszy wątek.

Główne punkty:

  • Wątek wywołuje wait na condition_variable, przekazując mutex, który posiada.
  • Podczas oczekiwania mutex jest zwalniany, umożliwiając innym wątkom dostęp do współdzielonych danych.
  • Gdy zdarzenie następuje, inny wątek wywołuje notify_one lub notify_all, aby obudzić oczekujące wątki.
  • Po przebudzeniu wątek ponownie przejmuje mutex i sprawdza warunek.

Przykład użycia:

#include <mutex>
#include <condition_variable>
#include <queue>

std::mutex mtx;
std::condition_variable cv;
std::queue<int> dataQueue;

void producer() {
    std::unique_lock<std::mutex> lock(mtx);
    dataQueue.push(42);
    cv.notify_one();
}

void consumer() {
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, []{ return !dataQueue.empty(); });
    int data = dataQueue.front();
    dataQueue.pop();
    // przetwarzanie danych
}

W ten sposób condition_variable pomaga efektywnie organizować oczekiwanie i powiadamianie między wątkami bez aktywnego pollingowania.