Ho bisogno di un "blocco" che può essere condiviso o tenuto in esclusiva, che fornirà il seguente comportamento per la seguente sequenza di eventi:
- Processo A: Richieste e viene concesso un blocco condiviso
- Processo B: richiede un blocco esclusivo ed è bloccato dalla proprietà di A del blocco
- Processo C: richiede un blocco condiviso ed è bloccato perché B è in linea per un blocco esclusivo
Avevo pensato che Unix flock
avrebbe fornito queste semantiche, ma poi scoperto che nel passaggio 3, la richiesta di Process C per un blocco condiviso avrebbe avuto successo e la richiesta di Process B per un blocco esclusivo sarebbe concesso solo quando non ci fossero serrature condivise. Questo ha lo sfortunato (per me) effetto che, più processi concorrenti ci richiedono blocchi condivisi, più lungo un processo che richiede un blocco esclusivo dovrà attendere una finestra in cui non sono presenti blocchi in sospeso.
Il comportamento che cerco, in altre parole, è che, dal momento in cui un processo richiede un blocco esclusivo, nel tempo in cui viene concesso il blocco e fino al momento in cui rilascia il blocco blocco, tutte le successive richieste di blocco condiviso verranno accodate e bloccate.
Quale tipo di blocco ha le proprietà di cui ho bisogno?