mikrocontroller.net

Forum: PC-Programmierung Linux Thread


Autor: christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Sebastian C. (basti79)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.