2014-05-16 9 views
5

Ho svolto alcune ricerche per trovare esattamente come Monitor.Enter funziona internamente. Ho guardato attraverso the code e sembra che il reale meccanismo per l'inserimento si trova all'interno di una funzione esterna:Come funziona Monitor.Enter?

[System.Security.SecuritySafeCritical] 
[ResourceExposure(ResourceScope.None)] 
[MethodImplAttribute(MethodImplOptions.InternalCall)] 
private static extern void ReliableEnterTimeout(Object obj, int timeout, ref bool lockTaken); 

Qualcuno sa che questa funzione fa o ciò che il meccanismo generale di Monitor.Enter è? Come fa a sapere quali oggetti sono bloccati?

+0

possibile duplicato di [Come funziona() funziona System.Threading.Monitor.Enter?] (Http://stackoverflow.com/questions/6770815/how-does-system-threading-monitor-enter-work) – gdoron

risposta

11

Come fa a sapere quali oggetti sono bloccati?

Ogni oggetto in .NET ha due (nascosto .. non si può vedere loro) membri in più generali.

  • Un "puntatore dell'oggetto tipo". Questo è solo un riferimento all'istanza Type dell'oggetto. In effetti, puoi "accedervi" chiamando lo GetType().
  • Un "indice blocco di sincronizzazione". Questo è un tipo integrale nativo di dimensione WORD che è un indice nell'array interno di "Sync Blocks" del CLR.

La struttura del blocco di sincronizzazione contiene un campo che può essere contrassegnato per il blocco. Fondamentalmente, quando blocchi un oggetto, questo campo è attivo. Quando il blocco viene rilasciato, viene disattivato (in pratica - non ho guardato il codice SSCLI per un tempo sufficiente a scavare più a fondo nel modo in cui funziona quel tipo di operazione - credo che sia basato su EnterCriticalSection però ..).

Gli argomenti MethodImplOptions.InternalCall passati all'attributo sopra indicano che l'implementazione effettiva di tale metodo risiede nel CLR .. motivo per cui non è possibile navigare ulteriormente attraverso il codice.

+0

grazie , ho sentito qualcosa lungo quelle linee ma non ho visto nessun campo in system.object. Sai dove posso trovare maggiori informazioni su questo? –

+0

Libri per lo più. CLR via C# si tocca su di esso .. Pro. NET Performance ha poco più di una pagina su di esso .. La sorgente condivisa CLI (ROTOR) ha un'implementazione di esso .. ed è qui che troverete un'implementazione di 'ReliableEnterTimeout' (il SSCLI esegue il mapping di questi nomi di funzioni ad altri internamente.Se lo si cerca, cercare '" ReliableEnterTimeout "' e vedere a cosa si indirizza). Ha anche un'implementazione di blocco di sincronizzazione (anche se non posso per la vita di me ricordare che cosa è stata chiamata quella struttura). –

+0

Forse guardate anche la funzione WinAPI 'EnterCriticalSection'. Credo che SSCLI utilizzi questo per alcuni meccanismi di blocco (su Windows comunque). –