Threads - gibt es einen Hauptthread?



  • Ich arbeite zur Zeit mit den boost::threads. In meiner main erstelle ich 5 Module die alle ähnlich aufgebaut sind. Alle 5 Module laufen in einem eigenen Thread. Zum Starten binde ich die Methode arbeiten() eines Moduls an einen neuen Thread.

    boost::thread Faden = boost::thread(boost::bind(&Modul::arbeiten, this));
    

    Nun frage ich mich, was ich der main machen soll!? Dieser "Hauptthread" gerät zu return 0 und das Programm ist zack aus. Ich würde diesen Thread gerne vernichten, ohne dass das Programm beendet wird.

    Die 5 Module sollen dezentral gesteuert sein und sich selbst verwalten. Möchte eines der Module das Programm beenden, so beendet er alle anderen Module und dann sich selbst. Das wird dann mittels join() gemacht? Aber wie beendet sich das Modul selber? Einfach auslaufen lassen?

    Oder müssen die Threads wieder von dem Thread beendet werden, der sie erstellt hat?



  • Lass den Hauptthread doch auch arbeiten, dann musst du den nicht beenden.

    Beenden eines Threas geht normalerweise so, dass er einfach fertig ist, respektive die Funktion, die aufgerufen wurde beendet wird.

    Das mit dem beenden kannst du ja so machen, dass du irgendwo eine Variable verwaltest, die den anderen Threads mitteilt, dass ein Modul beenden will. Die anderen können sich dann selbst auch auslaufen lassen.



  • Ne kleine Zwischenfrage: Was passiert eigentlich, wenn der Main Thread einen Thread startet und sich dann beendet?

    Also sowas hier:

    int main() {  // Main Thread
    
       Thread* t = new Thread(methode);
       t->start();
    
       return 0;
    } // Main Thread ende
    

    Läuft dann der gestartete Thread weiter oder wird der vom BS gekillt?


  • Mod

    Threads hängen am Hauptprozess. Wird dieser beendet, sterben auch alle Threads. Bei echten Unterprozessen kann dies jedoch eventuell anders sein (das liegt hier aber nicht vor).



  • Ja ich kann den "Hauptthread" auch arbeiten lassen. Dazu rufe ich an einem einzigen Modul die arbeiten() eben nicht in einem eigenen Thread auf, sondern verwende den "Hauptthread"

    BLOß: Wenn dieses Modul dann durch ein anderes beendet wird, dann terminiert meine gesamte Anwendung??



  • Such dir bei http://www.boost.org/doc/html/thread/synchronization.html eine passende Klasse raus, zum Beispiel Barrier.



  • Ich habe immer noch keine Lösung gefunden!

    Entweder ich lasse den Thread arbeiten, beende ihn oder lass ihn warten:

    Threads hängen am Hauptprozess. Wird dieser beendet, sterben auch alle Threads. Bei echten Unterprozessen kann dies jedoch eventuell anders sein (das liegt hier aber nicht vor).

    Das heißt wenn ich ihn arbeiten lasse und er beendet wird, wird meine gesamte Anwendung beendet??

    Ich will ihn nicht warten lassen, weil ich dann einen weiteren Thread habe und einen weiteren Threadwechsel. Eine Barrier geht auch nicht da sich ständig Threads starte und beenden können und ich nie weiß wieviele es sind. Dann müsste ich ihn das ständig überprüfen lassen.



  • Wahrscheinlich willst du keine Threads sondern separate Prozesse.



  • fabske schrieb:

    Ich will ihn nicht warten lassen, weil ich dann einen weiteren Thread habe und einen weiteren Threadwechsel.

    Der Satz kommt mir komisch vor. Klar hast du einen Threadwechsel - aber eben nur einmal. Viel teurer ist hier das Spawnen der ganzen Threads - das kostet viel mehr Zeit als dieser einmalige Wechsel.

    Du solltest erklären was du genau machen willst. Denn in den meisten Fällen ist die Antwort: der Hauptthread wartet auf seine Kinder die gesuchte Lösung. uU willst du eigene Prozesse (was aber viel teurer in der Herstellung ist) oder aber du willst gar keine Threads und garkeine Prozesse...

    Deshalb musst du uns erklären was du genau machen willst.



  • Was ist Spawnen?

    Ich programmiere ein Framework für eine regelungstechnische Anwendung. Das heißt ich habe X Module (5-10) die in eigenen Threads laufen und das zyklisch! Also z.B. mit 40 Hertz immer im Kreis (while-Schleife bis sie abgebrochen werden).

    Ich müsste den Hauptthread nun 40 mal pro Sekunde prüfen lassen, wie viele Threads es gerade gibt im Falle dass die Anwendung beendet werden soll, um dann eine Barrier einzurichten die auf alle Threads wartet.



  • Du kannst ganz einfach, nachdem Du alle Kindthreads erzeugt hast, mit allen Kindthreads joinen. Damit ist der Hauptthread erst dann fertig, wenn sich alle Kinder beendet haben. Überdies wird nie wieder in den Hauptthread gewechselt, weil die Bedingung dafür, dass der weiterläuft, nicht erfüllt ist. So schlau ist der Scheduler schon, nicht in einen Thread zu wechseln, der wartet.



  • oder wenn du von mikrocontrollern redest, dann lass den hauptthread schlafen und auf einen interrupt warten. so dass du nur jedesmal wenn ein worker thread beendet wird (was den interrupt auslöst) überprüfen musst wieviele worker noch laufen.

    um was für eine hardware handelt es sich denn?



  • Alles sehr interessante Vorschläge, ich denke ich werde mir einen aussuchen! 😉
    Es geht um ganz normale X86 Hardware.

    Ich habe 3 ganz wichtige Fragen:

    1. Was ist spawnen?
    2. Wie kann sich ein Thread selbst beenden? Er kann sich doch nicht joinen?
    3. Was passiert, wenn ein Thread einen Thread erstellt, und der erstellende Thread beendet wird? Wird dann auch der Kindthread beendet?



  • fabske schrieb:

    1. Was ist spawnen?

    Das Erzeugen neuer Threads. Noch nie nen Ego-Shooter gespielt, bei dem du nach dem Sterben wieder spawnst? 😃

    2. Wie kann sich ein Thread selbst beenden? Er kann sich doch nicht joinen?

    Du gibst dem Thread beim Erzeugen ne Funktion mit, die er abarbeiten soll. Wenn er mit dieser Funktion fertig ist, stirbt der Thread.

    3. Was passiert, wenn ein Thread einen Thread erstellt, und der erstellende Thread beendet wird? Wird dann auch der Kindthread beendet?

    Das ist ein schönes Beispiel, was man selbst testen kann: Gib alle x Sekunden einen thread-spezifischen String aus und beobachte das Ergebnis.



  • fabske schrieb:

    Alles sehr interessante Vorschläge, ich denke ich werde mir einen aussuchen! 😉
    Es geht um ganz normale X86 Hardware.

    Dann mach es mit einer Barrier. So schläft der Hauptthread und wird garnicht erst aufgeweckt bevor nicht alle Kinder fertig sind.



  • fabske schrieb:

    Dann mach es mit einer Barrier. So schläft der Hauptthread und wird garnicht erst aufgeweckt bevor nicht alle Kinder fertig sind.

    Und so hab ich es auch gemacht. Eine barrier die auf zwei Threads wartet. Der "Haupt-Thread" ruft wiat() auf und wartet. Der Thread der die Anwendung beendet, beendet alle anderen Threads mittels join() und ruft danach wait an der barrier auf. Der die main wartet ein bisschen (sleep) dass der beendende Thread "auslaufen" kann und ruft dann exit auf.



  • Michael E. schrieb:

    fabske schrieb:

    1. Was ist spawnen?

    Das Erzeugen neuer Threads. Noch nie nen Ego-Shooter gespielt, bei dem du nach dem Sterben wieder spawnst? 😃

    http://bst.bumchak.de/wp-content/uploads/2010/09/jesus-lag.jpg 😃


Log in to reply