La risposta breve è che è sorprendentemente difficile da rotolare il proprio blocco di lettura/scrittura. È molto facile perdere un problema di temporizzazione molto sottile che potrebbe causare un deadlock, due thread che pensano di avere un blocco "esclusivo", ecc.
In poche parole, è necessario tenere un conteggio del numero di lettori attivi in qualsiasi momento particolare. Solo quando il numero di lettori attivi è zero, si dovrebbe concedere un accesso in scrittura del thread. Ci sono alcune scelte progettuali sul fatto che i lettori o gli scrittori abbiano la priorità. (Spesso, si vuole dare agli scrittori la priorità, partendo dal presupposto che la scrittura viene eseguita meno frequentemente.) La parte (sorprendentemente) difficile consiste nel garantire che nessuno scrittore abbia accesso quando ci sono lettori, o viceversa.
C'è un eccellente articolo MSDN, "Compound Win32 Synchronization Objects" che consente di creare un blocco lettore/scrittore. Inizia semplice, poi diventa più complicato per gestire tutti i casi d'angolo. Una cosa che si è distinta è che hanno mostrato un campione che sembrava perfettamente buono, quindi avrebbero spiegato perché non avrebbe funzionato. Se non avessero indicato i problemi, forse non l'avresti mai notato. Vale la pena leggere.
Spero che questo sia utile.
fonte
2010-02-25 14:00:10
Stai parlando di un mutex normale o di un mutex Multiple Read/Single Write implementato con mutex/semaphores/condition variables? – stefaanv
@stefaanv: Non sono sicuro, ma penso che sia per mutex multiple read/multiple write implementato con mutex/semaphres/condition variables. C'è una cosa del genere? – jasonline
I mutex Multiple Read/Single Write non sono semplici, ho appena avuto un colpo e non sono riuscito :-(quindi ecco il link wikipedia: http://en.wikipedia.org/wiki/Readers-writer_lock – stefaanv