Abhängige Threads beenden



  • Hallo Leute, ich habe unter der GUI 2 Threads in Endlosschleifen laufen. Der zweite ist vom ersten abhängig, da er mittels Erzeuger-Verbraucher-Lösung Daten erhält. Wie beende ich am besten den zweiten Thread? Ich kann zwar von außen ein Flag setzen, aber leider würde er dann nicht die restlichen Elemente in der Liste verarbeiten.

    In der Bedingung prüfen ob die Liste leer ist, macht nicht viel Sinn. Da Elemente durch den ersten Thread bereitgestellt werden und somit auch mal keine Elemente in der Liste enthalten sind.

    Eine Möglichkeit wäre, dass der erste Thread wartet bis die Liste leer ist und dann im zweiten das Flag setzt. Nur entsteht dadurch eine starke Abhängigkeit der Threads untereinander, würde ich gerne vermeiden.

    Gruß Hummel8



  • Wie beende ich am besten den zweiten Thread?

    Sag es ihm!

    Ich kann zwar von außen ein Flag setzen, aber leider würde er dann nicht die restlichen Elemente in der Liste verarbeiten.

    Genau so! Aber ich dachte er soll sich beenden?

    In der Bedingung prüfen ob die Liste leer ist, macht nicht viel Sinn.

    Wie waere es mit einer Kombination aus Flag setzen und leerer Liste? (if flag && list.empty)



  • Er soll sich erst beenden, wenn die Liste keine Elemente mehr enthält. Bei einem externen abbruch ist es mit einem Flag leicht getan.

    Das Problem ist, dass die Liste auch mal leer sein kann. Die Bedingung sollte nicht vom Zustand der Liste abhängen. Daher klappt

    while (!flag && !is.empty())
    {
    // hier elemente verarbeiten
    }
    

    nicht.



  • Hummel8 schrieb:

    Er soll sich erst beenden, wenn die Liste keine Elemente mehr enthält. Bei einem externen abbruch ist es mit einem Flag leicht getan.

    Das Problem ist, dass die Liste auch mal leer sein kann. Die Bedingung sollte nicht vom Zustand der Liste abhängen. Daher klappt

    while (!flag && !is.empty())
    {
    // hier elemente verarbeiten
    }
    

    nicht.

    Du widersprichst Dir selbst in der Anforderung, daher kanns auch mit der Implementierung nicht klappen.

    Hummel8 schrieb:

    Er soll sich erst beenden, wenn die Liste keine Elemente mehr enthält.

    Hummel8 schrieb:

    Die Bedingung sollte nicht vom Zustand der Liste abhängen

    Du musst Dich schon entscheiden, entweder ist die Bedingung unabhängig von der Liste, dann darf der Thread aber auch abbrechen wenn die Liste voll ist, ODER die Bedingung ist abhängig von der Liste.

    Beides gleichzeitig geht nicht.



  • while (!flag && !is.empty())
    

    Deine Bedingung ist falsch. Hier wird die Schleife verlassen, sowohl wenn das Flag gesetzt wird als auch wenn die Liste leer ist. Nur eine der Bedingung muss erfuellt sein, nicht alle beiden. Besser ist vielleicht:

    while ( !(is.empty() && flag) )
    

    Jetzt wird die Verarbeitung abgebrochen, wenn die Liste leer ist und wenn flag = true ist.



  • Ja ich weiß dass ich mir wiederspreche, sonst hätte ich nicht nachgefragt. Aber eigentlich war die Lösung ganz simpel, vielen Dank an Knivil 🙂

    Es funktioniert und ich bin wunschlos glücklich



  • Andere Möglichkeit: du stopfst als letztes ein Terminator-Element in die Liste. Wenn er das verarbeitet weiß er dass der Producer danach nichts mehr liefert und beendet sich. Das Flag entfällt dadurch.



  • Vieleicht mit WaitForSingleObject() und OpenEvent() ?



  • in einem thread auf der liste zu arbeiten und im anderen darauf zugreifen ist relativ gefährlich und undefiniert ➡ Google: Mutex



  • übrigens schrieb:

    in einem thread auf der liste zu arbeiten und im anderen darauf zugreifen ist relativ gefährlich und undefiniert ➡ Google: Mutex

    Nicht, wenn du eine synchrone Liste verwendest. ConcurrentLinkedQueue eignet sich für das Erzeuger-Verbraucher Pattern.



  • DEvent schrieb:

    übrigens schrieb:

    in einem thread auf der liste zu arbeiten und im anderen darauf zugreifen ist relativ gefährlich und undefiniert ➡ Google: Mutex

    Nicht, wenn du eine synchrone Liste verwendest. ConcurrentLinkedQueue eignet sich für das Erzeuger-Verbraucher Pattern.

    Wenn man davon absieht, dass er C++ Tags verwendet hat, könnte das funktionieren. 😃


Anmelden zum Antworten