contition_variable beispiel von cplusplus.com



  • hola,

    auf cplusplus.com gibts ein beispiel fuer condition_variable:

    // condition_variable_any::notify_all
    #include <iostream>           // std::cout
    #include <thread>             // std::thread
    #include <mutex>              // std::mutex
    #include <condition_variable> // std::condition_variable_any
    
    std::mutex mtx;
    std::condition_variable_any cv;
    bool ready = false;
    
    void print_id (int id) {
      mtx.lock();
      while (!ready) cv.wait(mtx); // (1)
      // ...
      std::cout << "thread " << id << '\n';
      mtx.unlock();
    }
    
    void go() {
      mtx.lock();
      ready = true;
      cv.notify_all();
      mtx.unlock();
    }
    
    int main ()
    {
      std::thread threads[10];
      // spawn 10 threads:
      for (int i=0; i<10; ++i)
        threads[i] = std::thread(print_id,i);
    
      std::cout << "10 threads ready to race...\n";
      go();                       // go!
    
      for (auto& th : threads) th.join();
    
      return 0;
    }
    

    warum steht da in zeile (1) while ? reicht hier nicht ein if ?

    wenn ready false ist, dann wartet er ja darauf, das sich die variable aendert.sobald er vc.wait(mtx) aus dem aufruf zurueckkehrt ist doch die ready auf true gesetzt. warum wird das dann nochmal abgefragt ?

    Meep Meep



  • Je nach System kann es sogenannte "spurious Wakeups" geben. D.h. die Condition variable kann auch benachrichtigt werden (notify) ohne dass die Bedingung, auf die man eigentlich warten möchte, eingetreten ist. Daher muss man hier selbst nochmal sicherstellen, dass ready auch tatsächlich gesetzt wurde.

    Finnegan



  • Finnegan schrieb:

    D.h. die Condition variable kann auch benachrichtigt werden (notify) ohne dass die Bedingung, auf die man eigentlich warten möchte, eingetreten ist.

    Finde ich jetzt zumindest komisch formuliert. Ich würde sagen: wait kann (darf) zurückkommen ohne dass irgendwo notify aufgerufen wurde.



  • hustbaer schrieb:

    Finnegan schrieb:

    D.h. die Condition variable kann auch benachrichtigt werden (notify) ohne dass die Bedingung, auf die man eigentlich warten möchte, eingetreten ist.

    Finde ich jetzt zumindest komisch formuliert. Ich würde sagen: wait kann (darf) zurückkommen ohne dass irgendwo notify aufgerufen wurde.

    Ja, da ist was dran. Ich wollte damit eigentlich nur hervorheben, dass "notify" eine Benachrichtigung der CV ist (ohne damit explizit die Methoden der CV zu meinen), da Meep Meep auf dem Gebiet noch Neueinsteiger ist. Die Spurious Wakeups betrachte ich auch als "Benachrichtigung" also ein "notify" der CV, allerdings extern ausgelöst. Wenn ichs so nochmal lese ist es allerdings tatsächlich etwas missverständlich formuliert. Natürlich ruft das System nicht die notify-Methode der CV auf, sondern aktiviert lediglich den Thread und holt ihn aus dem Wartemodus. Deine Formulierung bringt aber auf den Punkt was eigentlich wirklich wichtig ist.

    Finnegan


Anmelden zum Antworten