lo hice el apoyo de CLR clases & para roscar en DotGNU y tengo un par de pensamientos ...
menos que necesite cerraduras proceso cruzado siempre se debe evitar el uso de mutex & semáforos. Estas clases en .NET son envoltorios alrededor de Win32 Mutex y Semáforos y son bastante pesadas (requieren un cambio de contexto en Kernel que es caro, especialmente si su bloqueo no está en disputa).
Como se mencionan otras, la instrucción de bloqueo C# es compilador mágico para Monitor.Enter y Monitor.Exit (existente dentro de una try/finally).
Los monitores tienen un mecanismo de señal/espera simple pero potente que Mutexes no tiene a través de los métodos Monitor.Pulse/Monitor.Esperar. El equivalente de Win32 sería objetos de evento a través de CreateEvent que en realidad también existen en .NET como WaitHandles. El modelo Pulse/Wait es similar a pthread_signal y pthread_wait de Unix, pero son más rápidos porque pueden ser operaciones completamente en modo usuario en el caso no contencioso.
Monitor.Pulse/Wait es fácil de usar. En un hilo, bloqueamos un objeto, revisamos un indicador/estado/propiedad y si no es lo que estamos esperando, llame a Monitor. Espere que suelte el bloqueo y espere hasta que se envíe un pulso. Cuando la espera vuelve, volvemos y revisamos el indicador/estado/propiedad nuevamente. En el otro hilo, bloqueamos el objeto cada vez que cambiamos el indicador/estado/propiedad y luego llamamos PulseAll para activar cualquier hilo que esté escuchando.
A menudo queremos que nuestras clases sean seguras para hilos, por lo que ponemos bloqueos en nuestro código. Sin embargo, a menudo sucede que nuestra clase solo será utilizada por un hilo. Esto significa que los bloqueos ralentizan innecesariamente nuestro código ... aquí es donde las optimizaciones inteligentes en el CLR pueden ayudar a mejorar el rendimiento.
No estoy seguro acerca de la implementación de bloqueos de Microsoft, pero en DotGNU y Mono, un marcador de estado de bloqueo se almacena en el encabezado de cada objeto. Cada objeto en .NET (y Java) puede convertirse en un bloqueo, por lo que cada objeto debe admitir esto en su encabezado. En la implementación de DotGNU, hay un indicador que le permite usar una tabla hash global para cada objeto que se usa como un bloqueo; esto tiene el beneficio de eliminar una sobrecarga de 4 bytes para cada objeto. Esto no es bueno para la memoria (especialmente para sistemas integrados que no están muy roscados) pero tiene un impacto en el rendimiento.
tanto mono como DotGNU utilizar eficazmente los mutex para realizar el bloqueo/espera, pero usar un estilo spinlock compare-and-exchange operaciones para eliminar la necesidad de realizar realmente un duro cerraduras menos que sea realmente necesario:
Se puede ver un ejemplo de monitores ¿Cómo puede ser implementado aquí:
http://cvs.savannah.gnu.org/viewvc/dotgnu-pnet/pnet/engine/lib_monitor.c?revision=1.7&view=markup
Este enlace me ayudó mucho: http://www.albahari.com/threading/ – Raphael