2011-10-07 12 views
5

Sto usando flock (2) in linux per controllare l'accesso alle risorse in un database homespun, usando entrambe le modalità di blocco condivise ed esclusive. Trovo che se viene concesso un blocco condiviso, anche un altro processo può ottenere un blocco condiviso, indipendentemente dal fatto che ci siano processi bloccati in attesa di blocchi esclusivi. Ciò significa che per una risorsa popolare con molti lettori sovrapposti, una richiesta di blocco esclusiva può far morire di fame per un lungo periodo, forse per sempre.Come mantenere linux flock (2) da richieste di blocco esclusive affamate?

Questo comportamento non contraddice la pagina man flock (2), ma mi sorprende perché questo codice funziona da anni in FreeBSD e OS-X senza problemi. La mia ipotesi è che i sistemi BSD debbano implementare un qualche tipo di coda per impedire che i blocchi esclusivi vengano affamati per sempre.

La mia domanda principale è: esiste un semplice trucco o un modello di programmazione per impedire alle mie serrature esclusive di morire di fame?

Una domanda secondaria, per soddisfare la mia curiosità, qualcuno sa se questo è davvero diverso sui sistemi BSD come sospetto?

+0

'stormo' mi ricorda le roulotte chiuse a chiave. –

risposta

0

Ho avuto esattamente lo stesso problema su FreeBSD 7.2 e non ho trovato alcun modo per prevenire la fame dello scrittore su flock(). Devi scegliere un altro metodo di blocco, come SysV IPC o semplice file stop-flag.