PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Thread->Problem; Suche Event o.ä.



LikeLaplace
14-11-2006, 19:48
Hallo Zusammen,

ich habe einen main-thread und zwei sub-threads.
ich möchte die sub-threads gesteuert durch einen timer in dem main-thread zum weiterlaufen anstoßen und sie nach einer gewissen zeit wieder anhalten, bis es wieder soweit ist, dass sie laufen sollen.

unter Windows kenne ich EVENTs, mit denen ich eine solche triggerung einfach machen kann (in diesem Fall würde es unter Windows auch mit Timer-Events funktionieren).

Aber wie kann ich mit Events unter linux arbeiten. Gesucht ist also eine Betriebssystemfunktion, die auf ein Event wartet. In folgender Art:

[sub-thread]

waitForSingleEvent(myEvent,INFINITE);

[main-thread]

setSingleEvent(myEvent);


ich könnte diese funktionalität auch mit polling auf eine Variable erreichen und mit sleep() arbeiten. Ist aber keine besonderst schöne Lösung für meine Aufgabe.


kann mir da jemand weiterhelfen?


Vielen Dank für die Mühe:) ,
LikeLaplace.

locus vivendi
14-11-2006, 20:30
Waitforsingleobject sollte sich durch eine Conditionvariable ersetzen lassen:
http://www.opengroup.org/onlinepubs/009695399/basedefs/pthread.h.html
Dort nach den pthread_cond* Sachen schauen.

Waitformultipleobjects wäre schon ein anderer Fall.

LikeLaplace
14-11-2006, 22:26
hi, danke für deine antwort.

ich hab das jetzt mal so gemacht. ich verstehe jedoch nicht genau wie das funktioniert. kannst du das in ein/zwei sätzen erklären? ist irgendwie schon kompliziert. das gefäält mir unter windows schon besser und ich frage mich, warum es da nichts besseres gibt. habe aber bisher auch nur diese lösung gefunden und die pthread.h gibt ja nicht mehr her.

noch pseudomäßig:

thread{
belege(mutex);
solange(keineArbeit==0){
warteAufCondition(meineCond);
}
freigeben(mutex);
erledigeDeineArbeit();
/*LOOP*/
}


main{
sleep(3);
keineArbeit=1;
signalisiereCondition(meineCond, mutex);
keineArbeit=0;
/*LOOP*/
}


ich verstehe dabei nicht, wozu ich die mutex benötige. würde mich freuen, von dir noch etwas hierzu zu lesen.

viele grüsse.

locus vivendi
15-11-2006, 12:55
ist irgendwie schon kompliziert. das gefäält mir unter windows schon besser und ich frage mich, warum es da nichts besseres gibt. habe aber bisher auch nur diese lösung gefunden und die pthread.h gibt ja nicht mehr her.
Naja, die Pthread-Funkitonen sind primitive Operationen, auf denen man aufbauen kann.


ich verstehe dabei nicht, wozu ich die mutex benötige.
Die brauchst du, weil sonst der Fall eintreten koennte, dass du gerade auf ein Ereignis (also signalisieren der CV) warten willst, aber gerade bevor du wartest kommt das Signal. Dann waere es moeglich das das Ereignis verschluckt wird. Siehe auch hier:
http://www.gnu.org/software/libc/manual/html_node/Condition-Variables.html

anda_skoa
15-11-2006, 16:51
Da hat ansich nichts mit pthreads zu tun, sondern ist normales Arbeiten mit Threads, daß praktisch überall gleich ist.

Neben Waitconditions gibts auch noch Semaphore. Bei Waitconditions hat man die einfache Möglichkeit alle Wartenden auf einmal los zu lassen, bei Semaphore bessere Kontrolle wieviele man los läßt.

Sobald man verstanden hat, wie Threads funktionieren, kann man mit diesen Konzepten ohne Problem arbeiten, weil sich das aus den Eigenschaften des Threadings ableitet.

Ciao,
_