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?
risposta
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.
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.
Sei a conoscenza di campioni che implementano un mutex di lettura/scrittura? – Jeremy
Questo tizio dice che in realtà non è possibile: http://stackoverflow.com/questions/1008726/win32-read-write-lock-using-only-critical-sections –
@PavelRadzivilovsky Questa domanda dice che non si può fare senza usando almeno un oggetto a livello di kernel, come un mutex. – McKay
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.)
+1 per nota sulle prestazioni –
- 1. Sincronizzazione Java tra JVM diversi
- 2. .NET ThreadPool QueueUserWorkItem Sincronizzazione
- 3. Implementazione di un elenco di processi con sincronizzazione interna
- 4. Processi di spawning dei dipendenti di sincronizzazione di Gunicorn
- 5. Processi leggeri in stile Erlang in .NET
- 6. Più memoria di processi .NET. Footprint
- 7. Opzioni di comunicazione tra processi
- 8. Sincronizzazione tra due database
- 9. Opzioni di sincronizzazione offline con .NET
- 10. comunicazione tra due processi in esecuzione node.js
- 11. Distinzione tra processi e thread in Linux
- 12. Dati di sincronizzazione Android tra gli utenti
- 13. Otto/EventBus tra più processi
- 14. Qual è il metodo più semplice di comunicazione tra processi tra 2 processi C#?
- 15. node.js - condivisione di socket tra processi
- 16. Condivisione di una variabile tra processi
- 17. .NET: meccanismo per la sincronizzazione di attività di lunga durata
- 18. Sincronizzazione vs. Prestazioni dei socket asincroni in .NET
- 19. Sincronizzazione cloud tra app iPad/iPhone
- 20. Test automatizzati .NET per processi di lunga durata
- 21. Sincronizzazione automatica tra Github e il forno
- 22. Condividi futex tra processi non collegati
- 23. condivisione puntatori tra più processi a forcella
- 24. Trasferimento handle socket tra processi indipendenti
- 25. Memoria condivisa tra processi C++ e Java
- 26. Utilizzare WM_COPYDATA per inviare dati tra processi
- 27. Variabile condivisa tra i processi Ruby
- 28. Condivisione di una coda di risultati tra più processi
- 29. C++ condivisione di oggetti di classe singola tra più processi
- 30. Sincronizzazione larghezza colonna tra tabelle in due frame diversi, ecc.
Cross processing o cross thread? –
@Albin - cross process. – Jeremy
Hai trovato qualche soluzione? – Bipul