PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c] fragen zu mutexe



quinte17
17-02-2004, 08:02
ich schreibe gerade ein programm das mehrere threads verwendet. nun habe ich ein paar variablen die evtl geschützt werden sollen durch solche mutexen...
der speicher wird zuvor per malloc geholt blabla.. (habe einen fifo)

so nun meine fragen:
wenn 2 threads nur lesend auf eine variable zugreifen, muss ich diese dann auch schützen?
ist es möglich explizit 1 variable zu schützen und nicht alle threads bei einem neuen lockrequest zu "blockieren"?

danke schonomal für hilfe
greetz

Trillian
17-02-2004, 16:34
1.) Glaube schon, bin mir aber nicht sicher.
2.) Ist pthread_mutex_trylock() die Lösung für dein Problem? Hab's nicht ganz verstanden.

quinte17
17-02-2004, 17:30
mhh nochmal zu 2.
soweit ich diesen lock verstanden habe wird damit alles gelockt was versucht erneut zu locken egal wie die zugehörige variable heißt...

ist es möglich einen mutexe auch zu benennen? somit wäre mir glaub ich auch geholfen...

danke für die antwort!
greetz

r00t043
17-02-2004, 18:26
Original geschrieben von quinte17
mhh nochmal zu 2.
soweit ich diesen lock verstanden habe wird damit alles gelockt was versucht erneut zu locken egal wie die zugehörige variable heißt...

Ich hab das anders verstanden, und zwar das


int pthread_mutex_trylock(pthread_mutex_t *mutex);

versucht den Mutex zu locken und falls er es schon ist, sofort zurückkehrt und den Thread nicht blockiert. Ob es erfolgreich war sieht man an dem Wert, der zurückgegeben wurde.

Original geschrieben von quinte17

ist es möglich einen mutexe auch zu benennen?
[...]

Ja es ist möglich, was soll man schliesslich mit einem der nicht benannt ist....
z.B.


pthread_mutex_t buffer_mutex;

panzi
21-02-2004, 19:53
@1
Wenn du nen Thread hast, der nur lesend auf eine spezielle Variable zugreift, dann muss der nicht locken. Damit aber der generierte code richtig funktioniert solltest du die Variable als volatile deklarieren, z.B.: volatile int i;
Hab das rausgefunden als ich ne schleife in einen thred hatte, welcher in der Abbruchbedingung ne globale Variable hatte, die von nen anderen Thread geändert wurde. Die Schleife lief endlos, da die Änderung nicht vom Thread bemerkt wurde (hatte wohl ne kopie der Variable in seinen stack????).

@2
Leg einfach für jede Variable je eine Mutex an. z.B. Variable: volatile int i; Mutex: pthread_mutex_t i_mutex; Dann einfach nur diese mutex locken, wenn du auf die Variable zugreifen willst.



@pthreads
Da hab ich dieses gute basic howto gefunden:
http://www.llnl.gov/computing/tutorials/workshops/workshop/pthreads/MAIN.html

Das ist ne nette Referenz:
http://java.icmc.sc.usp.br/library/books/ibm_pthreads/document.htm

Und die manpage helfen auch sehr:
http://unixhelp.ed.ac.uk/CGI/man-cgi?pthread_mutex_lock

Goggle einfach nach pthreads bzw. "posix threads".

quinte17
23-02-2004, 16:04
hey super!
danke für die einfache erklärung!
ich werd mir des dann gleich mal anschaun ;)

greetz