Estoy leyendo constantemente de un archivo mapeado en memoria en el que está escribiendo otro proceso y uso un mutex para sincronizar esta operación. En mis pocas pruebas hasta ahora, esto funciona bien, pero ... ¿qué pasa si mi aplicación falla justo después de adquirir el mutex y antes de liberarlo? ¿Hay alguna forma de garantizar un lanzamiento del mutex, incluso en caso de un bloqueo?"Manejo seguro" de un Mutex?
También, ¿cómo manejaría un bloqueo del otro proceso, que podría no haber liberado el mutex todavía? ¿Debo manejar AbandonedMutexException cada vez que llamo a mutex.WaitOne()?
En este momento lo estoy haciendo similar a esto:
public MyState GetState()
{
MyState state = new State();
this._mutex.WaitOne();
try
{
state.X = this._mmView.ReadSingle(0);
state.Y = this._mmView.ReadSingle(4);
[..]
}
finally
{
this._mutex.ReleaseMutex();
}
return state;
}
_mmView es una MemoryMappedViewAccessor que una instancia antes. Este método completo GetState() se llama cada cuadro como parte de un bucle de juego, por lo que cada pocos milisegundos.
PD: Además, ¿hay algún otro problema obvio por el que esto podría fallar, que no mencioné anteriormente?
"no escriba programas que nunca se cuelgan", o, como dijo el maestro Zen: "Evitar el error". Buen consejo. Ejem. – mickeyf
No suena muy robusto ni realista, sin embargo. ¿Qué pasa si el usuario simplemente mata el proceso a través del administrador de tareas, estrellándose a la fuerza la aplicación? – Mario
@Mario: No sé lo que piensas que es poco realista; Le aseguro que este tipo de errores de corrupción de datos surgen con frecuencia y deben protegerse si se preocupa por el estado de los datos del usuario. Re: qué pasa si el usuario bloquea la aplicación? ¿Me estás preguntando qué sucede cuando el usuario hace cosas que corrompen sus propios datos? ** Sus datos se corrompe **, eso es qué. Los usuarios que no quieren que sus datos estén dañados ** no deberían eliminar sus aplicaciones **. Hay una * razón * por la cual hacerlo muestra un cuadro de diálogo que dice "podrías corromper tus datos si haces esto". –