Linux Thread

Gast #1187540
Lesenswert?

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
Gast #1187556
Lesenswert?

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...
#1187559
Lesenswert?

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.
#1187565
Lesenswert?

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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren