threads



  • hallo leute

    ich moechte folgendes machen:
    ich habe einen konsolen-thread der auf eingabe wartet.
    ich brauche noch 2 threads die in einem bestimmten interval verzeichnisse ueberpruefen, ob neue dateien vorhanden sind.
    wenn ich nun in der konsole stop eingebe, sollen die beiden anderen threads beendet werden, ausser wenn sie grad am arbeiten sind, dann muss der erste thread darauf warten, das die beiden anderen fertig sind.
    wie mache ich das am besten ? ich kenn mich mit den std::threads noch nicht soweit aus, das ich da nen faden finde.
    wenn es unproblematisch abgeht, kann sich der erste thread auch gleich beenden, und die beiden anderen sollen ihre arbeit fertig machen und dann auslaufen.
    ich weiß aber nicht ob das so ohne weiteres geht.

    danke

    Meep Meep



  • Guck dir mal Mutexen ( std::mutex bzw. std::recursive_mutex ) und Condition-Variablen ( std::condition_variable bzw. std::condition_variable_any ) an. Idealerweise aber nicht (nur) in einer C++ Standard-Referenz, sondern (auch) irgendwo wo beschrieben steht wie die Dinger grundsätzlich funktionieren. Also wo die Konzepte Mutex und Condition-Variable beschrieben sind - im Gegensatz zur konkreten Umsetzung in C++.

    Und std::thread::join wirst du vermutlich auch brauchen.

    Meep Meep schrieb:

    wenn es unproblematisch abgeht, kann sich der erste thread auch gleich beenden, und die beiden anderen sollen ihre arbeit fertig machen und dann auslaufen.

    Das wird nicht funktionieren, weil dir die CRT einen Strich durch die Rechnung macht. Je nach OS läuft ein Prozess zwar so lange weiter bis alle Threads darin beendet wurden (auch wenn der "Haupt-Thread" schon vorher beendet wird)... aber die C- bzw. C++-Runtime beendet explizit den Prozess wenn main fertig gelaufen ist.

    Und davon abgesehen musst du den Threads ja auch mitteilen dass sie sich dann bitte demnächst beenden sollten. Dafür brauchst du auch wieder irgend einen Mechanismus. Idealerweise ohne dass die Threads dabei eine atomic Variable pollen müssen. Und dann sind wir erst wieder bei Condition-Variablen.


Anmelden zum Antworten