Monitor.Enter y Monitor.Exit en diferentes subprocesos

Monitor.Enter y Monitor.Exit están diseñados para ser llamados desde el mismo hilo. Pero, ¿qué sucede si necesito liberar un bloqueo en un subproceso diferente al adquirido?

Por ejemplo: hay recursos compartidos y operaciones asincrónicas que utilizan este recurso. La operación comienza con BeginOperation y adquiere el bloqueo en el recurso compartido. Allí también el EndOperation método que libera el bloqueo. EndOperation normalmente se llama en otro hilo desde una devolución de llamada, por lo tanto, no puedo llamar Monitor.Exit en la EndOperation método. ¿Cuál es el mejor enfoque en este caso? Comprobará dos veces el bloqueo con AutoResetEvent en lugar de Monitor ser una buena solucion?

preguntado el 12 de junio de 12 a las 18:06

3 Respuestas

La primitiva que estás buscando se llama semáforo que se puede ingresar de manera segura en un hilo y salir de otro.

contestado el 12 de mayo de 15 a las 21:05

Si puede usar .NET 4.0, puede reemplazarlo con Sistema.Threading.Semáforo lo que le permite adquirir permisos en un hilo y liberarlos en otro.

La clase Semaphore no aplica la identidad del subproceso en las llamadas a WaitOne o Release.

Respondido el 12 de junio de 12 a las 18:06

Si el subproceso A toma la última ranura abierta en un semáforo y el subproceso B señala una liberación... ¿qué sucedería? Esto es algo que no entiendo en los semáforos y no sé cómo/dónde investigarlo. - Mathgenius

Intente usar un ManualResetEvent, se usa para bloquear los anuncios hasta que se active algún evento externo. Documento de MSDN:

http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx

Respondido el 12 de junio de 12 a las 18:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.