Hallo, ich habe ein Problem mit Posix Threads unter Linux. Dabei möchte ich 2 Threads erzeugen(laufen solange wie main()). Diese sollen sich nur beenden, wenn eine best.Bedingung erfüllt ist. Wenn innerhalb eines Threads diese Bedingung erfüllt ist sollen sich ALLE Threads beenden(ausser main). Das Problem dabei ist, das ich nicht einfach mit pthread_join() auf den Rückgabewert warten kann. Laufen die erzeugten Threads soll main nicht blockieren. main(){ ... pthread_create(&id1, NULL, thread, 0); pthread_create(&id2, NULL, thread, 0); //hier kein pthread_join() sonst blockiert ... } void *thread(void *arg) { ... //wenn irgendeine Bed. erfüllt dann exit if(Bed == wahr) pthread_exit(); } Danke für jede Hilfe
So wie du das da beschreibst, hast du eindeutig einen Konzeptfehler produziert. Also: Erstmal muss in die Threadroutine eine Schleife, sonst macht das mit der Bedingung nur selten Sinn (machnmal machts Sinn, aber ich glaub, du willst etwas Andres erreichen). Den Thread, also die Routine, kannst du dann einfach mit return verlassen, sieht zudem noch hübsch aus :-) Wenn du dann in main() etwas am fabrizieren bist, und da das Ergebnis der anderen Threads abholen möchtest, musst du zwangsläufig auf die Threads warten (sonst liegt das Ergebnis ja noch garnicht vor). Oder aber du musst auch da 'Pollen', sprich beim Verlassen einer Thread-Routine ein Flag setzen und dieses regelmäßig in main() prüfen. Und immer schön an volatile denken...
Hallo, "The pthread_tryjoin_np() function performs a non-blocking join with the thread, returning the exit status of the thread in *retval. If thread has not yet terminated, then instead of blocking, as is done by pthread_join(3), the call returns an error." Ich denke das ist das wonach du suchst. Greets Sebastian.
Wenn die Bedingung auf globalen Informationen beruht, beenden sich die Threads doch ohnehin, wenn sie die Bedingung regelmäßig testen, oder nicht? Ansonsten musst du die ganzen Thread-IDs global machen, und der erste Thread, der die Bedingung mitbekommt, beendet dann halt reihum alle (aber sich zuletzt, oder das Beenden findet in einem eigenen weiteren Thread statt, der dann stehen bleibt)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.