2009-05-23 8 views
11

Qual è la differenza tra uno monitor e uno lock?Differenza tra monitor e blocco?

Se un blocco è semplicemente un'implementazione dell'esclusione reciproca, allora un monitor è semplicemente un modo di utilizzare il tempo di attesa tra le esecuzioni del metodo?

Una buona spiegazione sarebbe veramente utile grazie ....

riguarda

risposta

13

Per esempio in C# .NET una dichiarazione di blocco equivale a:

Monitor.Enter(object); 
try 
{ 
    // Your code here... 
} 
finally 
{ 
    Monitor.Exit(object); 
} 

Tuttavia, tenere presente che monitor può anche Wait() e Pulse(), che sono spesso utili in situazioni complesse multithreading.

Edit: Nelle versioni successive di .NET framework, questo è stato cambiato a:

bool lockTaken = false; 
try 
{ 
    Monitor.Enter(object, ref lockTaken); 
    // Your code here... 
} 
finally 
{ 
    if (lockTaken) 
    { 
     Monitor.Exit(object); 
    } 
} 
+0

@John Gietzen: fantastico ...grazie per la grande spiegazione. – IAbstract

1

monitor sono serrature "semi-automatiche" compilatore-assistita. Permettono di dichiarare i metodi synchronized sulle classi, ecc. Questo è solo un approccio diverso per fornire l'esclusione reciproca. Ho trovato this book come la spiegazione più completa dei concetti, anche se è principalmente orientata verso gli sviluppatori di sistemi operativi.

0

Un blocco garantisce l'esclusione reciproca.

Un monitor associa i dati da proteggere e le primitive di esclusione e sincronizzazione reciproche richieste per proteggere gli accessi ai dati.
La sincronizzazione viene utilizzata ad es. quando è necessario un thread per attendere fino a quando si verifica un evento (ad esempio, attendere fino a quando un altro thread inserisce un elemento in una coda).

0

I monitor sono un costrutto del linguaggio di programmazione che fa la stessa cosa di semifori/blocchi, ma i monitor controllano i dati condivisi sincronizzandosi in fase di esecuzione. Al contrario, i blocchi proteggono i dati condivisi semplicemente "ruotando", il che può portare a un cattivo utilizzo della CPU.

-1

Blocco di messa a fuoco solo su l'eccitazione reciproca, ma Moniter fornisce l'esclusione reciproca automaticamente.

Quindi non dobbiamo preoccuparci di utilizzare l'esclusione reciproca in Monitor. Invece di ME, dobbiamo preoccuparci di sycronzing solo quando programmiamo.

Moniter offre un modo più sistematico di programmazione. Per questo è più avanzato.

0

Non c'è differenza, il blocco genera Monitor.Enter e Monitor.Exit all'interno di un blocco try/finally. L'uso di Monitor over lock ti permette di perfezionare le impostazioni perché ha Pulse e PulseAll. È anche possibile avere un'elaborazione alternativa se non si è in grado di acquisire il blocco con TryEnter.

-1

Monitor è il concetto e Lock è l'implementazione effettiva.