C / Linux: pthread_mutex_lock/unlock

Gast #4196817
Lesenswert?
• ▲
▼
Moin,

Ich haett' gerne mal ein Problem, un' zwar folgendes:

Einen wilden Buffer mit Daten, der von einem Thread geschrieben werden 
koennen soll, und von vielen anderen Threads gelesen werden koennen 
soll.

Dabei duerfen sich nur der Schreibthread und die Lesethreads nicht in 
die Quere kommen. Mehrere Lesethreads koennen ruhig "gleichzeitig" auf 
den Buffer zugreifen.

Schuetz' ich das jetzt mit einem klassischen pthread_mutex_lock/unlock, 
dann kann ja auch immer bloss ein Lesethread auf den Buffer zugreifen - 
gibts da irgendeine Mutex-Art oder irgendein Mutex-Attribut, mit dem man 
sowas regeln kann?  Koennte da "PTHREAD_MUTEX_RECURSIVE" in die richtige 
Richtung gehen?

Gruss
WK
Gast #4196885
Lesenswert?
• ▲
▼
Moin,

du lockst den Zugriff auf den Buffer nur dann und in der Funktion, in 
der du was rein schreibst/änderst.

Primitives Beispiel (ich nehme an du nutzt pthreads, aber sinngemäß ist 
es immer das gleiche):

pthread_mutex_lock(&mutex);
...
hier der Kram der den Buffer verändert
...
pthread_mutex_unlock(&mutex);



Nebenläufiges oder paralleles lesen brauchst du i.d.R. nicht locken.
Gast #4196900
Lesenswert?
• ▲
▼
doch er muss auch beim lesen einen mutex setzen, sonst weiss der schreib 
thread nicht, ob er einen leseprozess stört (Daten werden während sie 
gelesen werden geändert).
ich würde das über ein public subscribe verfahren machen.
eine dynamische list mit lese channels, wo sich lese threads anmelden 
müssen.
wenn jetzt ein lese thread lesen möchte muss er seinen channel per mutex 
sperren. wenn der schreibprozess etwas schreiben möchte muss er warten 
bis alle lesechannels ihren mutex freigegegeben haben. und zusätzlich 
würde ich noch ein schreibe mutex setzen, damit leseprozesse keinen 
neuen mutex setzen und das System damit vom schreiben blockieren.

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