6

Esiste un meccanismo di blocco di lettura/scrittura che funziona attraverso i processi (simile a Mutex, ma in lettura/scrittura invece di blocco esclusivo)? Vorrei consentire l'accesso simultaneo in lettura, ma l'accesso in scrittura esclusivo.Primativo di sincronizzazione lettura-scrittura tra processi in .NET?

+0

Cross processing o cross thread? –

+0

@Albin - cross process. – Jeremy

+0

Hai trovato qualche soluzione? – Bipul

risposta

4

No. Come Richard ha notato sopra, non esiste tale fuori dal meccanismo di chiusura in .NET. Ecco come implementarlo usando un mutex e un semaforo.

Metodo # 1 è descritta in http://www.joecheng.com/blog/entries/Writinganinter-processRea.html, citare:

// create or open global mutex 
GlobalMutex mutex = new GlobalMutex("IdOfProtectedResource.Mutex"); 
// create or open global semaphore 
int MoreThanMaxNumberOfReadersEver = 100; 

GlobalSemaphore semaphore = new GlobalSemaphore("IdOfProtectedResource.Semaphore", MoreThanMaxNumberOfReadersEver); 

public void AcquireReadLock() 
{ 
    mutex.Acquire(); 
    semaphore.Acquire(); 
    mutex.Release(); 
} 

public void ReleaseReadLock() 
{ 
    semaphore.Release(); 
} 

public void AcquireWriteLock() 
{ 
    mutex.Acquire(); 
    for (int i = 0; i < MoreThanMaxNumberOfReadersEver; i++) 
    semaphore.Acquire(); // drain out all readers-in-progress 
    mutex.Release(); 
} 

public void ReleaseWriteLock() 
{ 
    for (int i = 0; i < MoreThanMaxNumberOfReadersEver; i++) 
    semaphore.Release(); 
} 

Un'alternativa sarebbe:

Leggi bloccaggio - come sopra. Scrivi bloccaggio come segue (pseudocodice):

- Lock mutex 
- Busy loop until the samaphore is not taken AT ALL: 
-- wait, release. 
-- Release returns value; 
-- if value N-1 then break loop. 
-- yield (give up CPU cycle) by using Sleep(1) or alternative 
- Do write 
- Release mutex 

Si deve notare che l'approccio più efficiente è possibile, come in questo caso: http://en.wikipedia.org/wiki/Readers-writers_problem#The_second_readers-writers_problem Cercare le parole "Questa soluzione è ottimale" nell'articolo di cui sopra.

-1

System.Threading.Mutex ha un mutex che può essere utilizzato per la comunicazione intra-processo. Se desideri funzionalità che non supporta, può essere implementata tramite un mutex.

+1

Sei a conoscenza di campioni che implementano un mutex di lettura/scrittura? – Jeremy

+0

Questo tizio dice che in realtà non è possibile: http://stackoverflow.com/questions/1008726/win32-read-write-lock-using-only-critical-sections –

+0

@PavelRadzivilovsky Questa domanda dice che non si può fare senza usando almeno un oggetto a livello di kernel, come un mutex. – McKay

-2

Hai guardato System.Threading.ReaderWriteLock? Ecco il collegamento MSDN.

+1

Questo non è cross-process – Zippit

+1

Ah. Ha sbagliato la domanda (ancora alla prima tazza di caffè). Lascerò questo per alcuni minuti e poi lo cancellerò. – AllenG

5

Windows non include un blocco Reader-Writer per processi incrociati. Una combinazione di Semaphore e Mutex potrebbe essere usata per costruirne una (il Mutex è detenuto da uno scrittore per l'accesso esclusivo o da un Reader che usa il semaforo per rilasciare altri lettori — cioè gli scrittori attenderanno solo il mutex e i lettori per entrambi) .

Tuttavia, se si prevede che la contesa sia bassa (ovvero nessun thread tiene un blocco per molto tempo), l'esclusione reciproca potrebbe essere ancora più veloce: la complessità aggiuntiva del blocco lettore-scrittore travolge qualsiasi vantaggio di consentire l'accesso a più lettori. (Un blocco lettore-scrittore sarà più veloce se ci sono molti più lettori e blocchi bloccati per un tempo significativo — ma solo il tuo profilo può confermarlo.)

+0

+1 per nota sulle prestazioni –

Problemi correlati