2010-02-03 6 views
23

Ho alcune domande riguardanti i blocchi di lettura/scrittura in Phasread POSIX su un sistema * nix, ad esempio Linux.Come prevenire l'inattività degli scrittori in un blocco di scrittura read in pthreads

Desidero sapere qual è il bias predefinito per il blocco di lettura della scrittura, preferisce la lettura delle scritture o viceversa? Fornisce qualche api per modificare questo comportamento predefinito.

Il pthread di posix fornisce alcune API in modo da poter modificare pthread_rwlock_t per impedire l'inattività dell'autore? Da quello che ho letto (correggimi se ho torto), l'implementazione di default è distorta nei confronti dei thread dei lettori e quindi i thread degli scrittori possono affrontare la fame.

Ho letto l'esempio di implementazione di rw lock dal libro Programming with Posix threads di David Butenhof.

Vorrei sapere come i pthreads posix gestiscono la fame dei thread degli scrittori? C'è qualche api con il quale potremmo impostare gli attributi del blocco di scrittura in lettura che impedirebbero la digitazione per fame (non ne ho mai sentito parlare)? O l'utente deve gestire questo problema?

Se pensate che la risposta sia definita dall'implementazione, per favore datemi un esempio di come è fatto in Linux, perché questo è quello che sto cercando.

Si prega di notare che voglio solo soluzioni per un sistema * nix. Non penso di essere scortese, ma pubblicare un codice specifico per Windows è inutile per me.

Grazie a tutti per il vostro aiuto e la pazienza :)

+0

L'utilizzo di un mutex anziché un rwlock eviterà questo problema. Se il conflitto è basso, è anche più veloce in alcune implementazioni (come quelle che costruiscono un rwlock da un mutex e una variabile di condizione). – jilles

risposta

35

Questo in effetti dipende dalla realizzazione - in modo da quando avete chiesto di Linux in particolare, i miei commenti sono si riferiscono alla implementazione corrente NPTL di pthreads, che è usato in moderno glibc.

Qui ci sono due problemi correlati, ma separati. In primo luogo, c'è questa situazione:

  • Ci sono blocchi di lettura attualmente in attesa e scrittori in attesa. Un nuovo thread tenta di prendere un blocco di lettura.

L'azione predefinita qui è consentire al lettore di procedere - in modo efficace "saltando la coda" sul writer. Tuttavia, è possibile ignorarlo. Se si utilizza la funzione pthread_rwlockattr_setkind_np() per impostare il flag PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP su attr passato a pthread_rwlock_init(), il rwlock bloccherà il lettore nella situazione sopra descritta.

La seconda situazione è:

  • l'ultimo detentore rilascia il blocco, e ci sono entrambi i lettori e scrittori in attesa.

In questa situazione, NPTL si sveglierà sempre uno scrittore in preferenza a un lettore.

Nel loro insieme, i mezzi di cui sopra che se si utilizza il flag PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, scrittori non devono essere affamati (ovviamente, ora un flusso continuo di scrittori può morire di fame i lettori. C'est la vie). È possibile confermare tutto ciò verificando le fonti (è tutto molto leggibile) in pthread_rwlock_rdlock.c e pthread_rwlock_unlock.c.

Nota che c'è anche un PTHREAD_RWLOCK_PREFER_WRITER_NP, ma sembra non avere il giusto effetto - molto probabilmente un bug (non o forse - vedi comment by jilles below).

+0

grazie mille. Questo è quello che stavo cercando. Un'altra cosa è la funzione pthread_rwlockattr_setkind_np() a POSIX api o solo linux specifica? Non riuscivo a vederlo nel file di intestazione /usr/include/pthread.h sul mio sistema linux (potrebbe essere il suo vecchio). E cosa significa "np"? Grazie mille :) – ghayalcoder

+1

È elencato come estensione UNIX98 qui: http://nptl.bullopensource.org/Tests/Optimization-level-in-nptl.html ma credo che sia un errore, ed in realtà è un'estensione GNU (come sono tutte le altre funzioni che terminano con '_np'). Sicuramente in pratica non è disponibile altrove. Presumo che '_np' è l'abbreviazione di' NPTL', che significa "Native POSIX Threads Library". Non sono sicuro di quale versione di glibc l'abbia introdotta, ma ce l'ha glibc 2.7 sulla mia scatola. Forse chiedere sulla mailing list di glibc? – caf

+0

Grazie mille caf :) – ghayalcoder

Problemi correlati