2016-05-24 28 views
6

È possibile utilizzare SRW Locks tra i processi quando vengono inseriti nella memoria condivisa?Blocco SRW nella memoria condivisa

Il loro ingombro di memoria sembra essere un singolo puntatore, ma non riesco a trovare la documentazione su ciò che accade effettivamente in background durante il blocco.

Vorrei evitare i mutex del kernel se possibile, ma inizia a sembrare che sto entrando in un terreno di comportamento non definito.

+0

http://www.flounder.com/msdn_documentation_errors_and_omissions.htm#InitializeSRWLock –

risposta

5

I blocchi SRW non possono essere condivisi tra processi. Questo è implicito per omissione punta nella frase della documentazione che dice

lettore Slim/scrittore (SRW) serrature permettono i fili di un unico processo per accedere alle risorse condivise di apertura ...

Questi oggetti sfruttano il fatto che vengono utilizzati all'interno di un singolo processo. Ad esempio, i thread in attesa di entrare nel blocco vengono tracciati sotto forma di un elenco collegato. Questo elenco di thread in attesa deve ovviamente essere mantenuto da qualche parte all'esterno di SRWLock, poiché il SRWLock ha solo la dimensione di un singolo puntatore e non è possibile inserire un elenco di 10 thread in un singolo puntatore. Tale elenco collegato non sarà accessibile ad altri processi.

0

SRW è un oggetto utente (proprio come le sezioni critiche) e non gli oggetti del kernel. Non possono essere condivisi tra processi. Non hanno nome.

SRW sono implementate per prestazioni: sono più veloci delle sezioni critiche (e ovviamente più veloci dei mutex). Non consentono i blocchi ricorsivi (permessi CS e mutex).

Poiché sono implementati per la velocità e le prestazioni, sono progettati per lo stesso solo accesso al processo. Mettere un handle SRW sulla memoria condivisa non renderà disponibile per altri processi per iniziare a usarlo. SRW è solo un handle opaco per l'implementazione interna. Quando handle viene mappato da un processo, si trova nello stesso limite del processo - non può essere condiviso da altri processi. Dal momento che non sono oggetti del kernel, anche l'ereditarietà dell'handle non è possibile.