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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.