boost::condition_variable_any



  • Meine Frage hat mich auch zur Lösung geführt! Man muss natürlich wait an der barrier aufrufen! Hab das nun so gelöst, dass das DatenModul ein private: boost::barrier* schranke; hat. Im Konstruktor wird diese barrier dann initialisiert:

    DatenModul::DatenModul(int i) : AnzahlModule(i)
    {
      schranke = new boost::barrier(i);
    };
    

    i ist die Anzahl an Modulen, sie wird dem DatenModul bei Konstruktion übergeben. Das Problem ist nur, das funktioniert auch nicht 😞 schreibe ich da anstatt i eine 3 rein funktioniert alles wunderbar. Nur irgendwie mag er das i nicht. Es kompiliert zwar, aber beim i kommt bei Ausführung:

    terminate called after throwing an instance of 'std::invalid_argument'
      what():  count cannot be zero.
    Aborted
    

    Kann mir das jemand erklären?



  • dann konstruierst du wohl irgendwo ein solches ding mit 0, nen?
    die einfachste erklärung ist meist die beste.

    und der debugger ist dein freund.



  • hustbaer schrieb:

    dann konstruierst du wohl irgendwo ein solches ding mit 0, nen?

    Nein, definitiv nicht! Ich ruf das Teil nur einmal in der main auf

    DatenModul* D = new DatenModul(3);
    

    Der barrier() will eigentlich size_t und ich gebe ihm einen integer. Ist das ein Problem?

    class barrier : private boost::noncopyable   // Exposition only
    {
    public:
      // construct/copy/destruct
      barrier(size_t);
      ~barrier();
    
      // waiting
      bool wait();
    };
    


  • Das ist mir jetzt peinlich. Du hattest recht, ich hab an einer anderen Stelle tatsächlich mit 0 initialisiert!
    Sorry und Danke!



  • fabske schrieb:

    Das ist mir jetzt peinlich. Du hattest recht, ich hab an einer anderen Stelle tatsächlich mit 0 initialisiert!
    Sorry und Danke!

    Hihi. Kein Problem.



  • Ich würde jetzt aber doch gerne noch wissen wie man ein Signal realisiert. Hab grad wieder die Situation, dass ein Thread warten muss bis ein anderer etwas erledigt hat. Soll ich da dann einen barrier mit zwei Teilnehmern erstellen?



  • Ich würde auch hier eine normale Condition-Variable + Mutex + bool Flag verwenden.
    Und dann "ganz normal" mit while (!flag) condition_variable.wait(lock); warten.

    Natürlich gibt es auch andere Lösungen, aber dafür z.B. eine Barrier zu verwenden, erscheint mir irgendwie komisch.



  • Ich hab nun doch eine barrier genommen und funktioniert sehr gut!

    Was ist eigentlich der Unterschied zwischen condition_variable und condition_variable_any?



  • Hallo,

    vergleiche doch die Klassen:

    http://www.boost.org/doc/libs/1_35_0/doc/html/thread/synchronization.html

    boost::condition_variable_any lässt sich mit jedem Mutex-Typen verwenden.

    MfG,

    Probe-Nutzer



  • Vielen Danke! Im Moment mache ich mir über die Destruktion von Objekten Gedanken, muss ich da bei condition_variable und barrier irgendwas beachten? Was ist wenn noch ein Thread wait() aufgerufen hat und ich diese barrier vernichte??


Anmelden zum Antworten