Domanda

In .NET la parola lock è zucchero sintattico intorno Monitor.Enter e Monitor.Exit, quindi si potrebbe dire che questo codice

lock(locker)
{
  // Do something
}

è lo stesso di

Monitor.Enter(locker);
try
{
  // Do Something
}
finally
{
  Monitor.Exit(locker);
}

Tuttavia, il .NET framework include anche la classe MemoryBarrier che funziona in modo simile

Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();

Sono confuso come quando vorrei utilizzare Thread.MemoryBarrier rispetto alla versione lock / Monitor? Io sono fatto ancora più confuso da un tutorial Threading in cui si afferma funzionano lLa stessa.

Per quanto posso vedere la differenza visibile non si ha bisogno di un oggetto di blocco, che credo che l'utilizzo di Monitor si potrebbe fare qualcosa attraverso le discussioni in cui è MemoryBarrier su un singolo thread.

Il mio istinto mi dice che un'altra differenza chiave è MemoryBarrier è per le variabili e non per i metodi.

Infine questo non è legato alla domanda esistente Quando usare 'volatili' o 'Thread.MemoryBarrier ()' in threadsafe codice di blocco? (C #) , come che si concentra sulla parola chiave volatile che capisco il suo utilizzo di.

È stato utile?

Soluzione

A mio avviso si dovrebbe quasi non uso Thread.MemoryBarrier. Questo è usato per libero lock- codice - fare in modo che le modifiche apportate su un thread sono visibili ad un altro senza sostenere il costo di una serratura. Fa non sincronizzazione filo controllo, a differenza lock. Non vedo dove nel tutorial di Joe dice che "funzioni lo stesso" MemoryBarrier come lock. Ci può spiegare dove esattamente si sta ricevendo questa impressione da?

A mio avviso, il codice a basso livello di lock-libero è troppo difficile per chiunque altro che gli sviluppatori la cui competenza principale è la concorrenza. Se voglio scrivere del codice senza blocchi, userò blocchi di costruzione di livello superiore costruito per gli sviluppatori (come ad esempio le estensioni parallele in .NET 4.0), piuttosto che cercare di rotolare il mio.

Per fare un esempio, di recente ho avuto i miei occhi aperti per il preciso significato di volatile che non è "lette dalla memoria principale, sempre scrivere direttamente nella memoria principale". (La mia filettatura esercitazione ha ancora che la spiegazione in questo momento - qualcosa che ho bisogno di fissare a un certo punto.) E 'molto più sottile di quello . Ciò significa che alcuni dei miei usi precedenti di volatile potrebbero non essere corrette.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top