Vorrei compilare un elenco di tutte le possibili condizioni che rendono Monitor andare in modalità kernel/utilizzare l'oggetto di sincronizzazione del kernel.Quando esattamente .NET Monitor va in modalità kernel?
Il blocco di sincronizzazione ha un campo per fare riferimento all'oggetto del kernel quindi ho dedotto che lo lock
passerà in modalità kernel qualche volta.
ho trovato questo: Lock (Monitor) internal implementation in .NET
ma ha troppe domande a cui rispondere e l'unica informazione utile è che il PO ha risposto alla sua stessa domanda, semplicemente affermando che il lock
andrà alla modalità kernel qualche volta. Inoltre non ci sono collegamenti a nulla per supportare quella risposta.
La mia domanda è diversa - Voglio sapere quando esattamente lock
andrà in modalità kernel (non se e non perché - quando).
io sono più interessato a sentir parlare di .NET 4 e 4,5 se non v'è alcuna differenza con le versioni precedenti
EDIT: Dal libro Richter: "Un blocco di sincronizzazione contiene campi per un oggetto del kernel, il possedere l'ID del thread, un conteggio della ricorsione e un conteggio thread in attesa. "
grazie mille. soprattutto per il SSCLI - non sapevo che fosse disponibile pubblicamente. –
Grazie per il commento che mi ha indirizzato a una parte rilevante nella sorgente CLR. Sono interessato in particolare alla spinning part: è comunemente richiesto Monitor sui primi spin prima di passare al kernel. E mi interessa come gira esattamente (numero di iterazioni, ...). Non riesco a vedere la rotazione nel percorso del codice che hai descritto, tuttavia, vedo la logica della rotazione in AwareLock :: Contention chiamata da AwareLock :: TryEnter. Ora sembra che questo si applica solo a TryEnter quando viene utilizzato il timeout, quindi suppongo che la rotazione non venga utilizzata quando si utilizza la parola chiave C# lock. Ho ragione? –