3 votes

Mauvais exemple de std::condition_variable sur cppreference ?

Dans leur exemple l'utilisation de std::condition_variable ils ont essentiellement

std::mutex m;
std::condition_variable cv;
bool ready = false;

void worker_thread()
{
    // Wait until main() sends data
    std::unique_lock<std::mutex> lk(m);
    cv.wait(lk, []{return ready;});
    // more ...
}

int main()
{
    std::thread worker(worker_thread);

    data = "Example data";
    // send data to the worker thread
    {
        std::lock_guard<std::mutex> lk(m);
        ready = true;
    }
    cv.notify_one();
    // more...
}

Mon problème est maintenant la variable ready qui n'est pas déclarée std::atomic* .

Pourquoi cela n'introduit-il pas une condition de course en cas de réveil intempestif ?

5voto

David Haim Points 3696

Non, il n'y a pas de condition de course.
Même si la variable de condition se réveille de manière erronée, elle doit réacquérir le verrou :

  1. aucun fil ne peut toucher ready tant que la serrure est maintenue, car une serrure la protège.
  2. en acquérant à nouveau le verrou, le booléen doit être synchronisé, car le verrou impose l'acquisition de l'ordre de mémoire, ce qui entraîne la perte de l'ordre de mémoire et la perte de l'ordre de mémoire. ready pour avoir la dernière valeur.

Il n'y a donc aucune chance que des conditions de course se produisent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X