Forum: PC-Programmierung Linux Thread


von christian (Gast)


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

von Sven P. (Gast)


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...

von Sebastian C. (basti79)


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.

von Klaus W. (mfgkw)


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)

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
Noch kein Account? Hier anmelden.