Sto costantemente leggendo da un file mappato in memoria un altro processo sta scrivendo e uso un mutex per sincronizzare questa operazione. Nei miei pochi test finora funziona perfettamente, ma ... cosa succede se la mia applicazione si blocca subito dopo aver acquisito il mutex e prima di rilasciarlo? C'è un modo per garantire un rilascio del mutex, anche in caso di un tale incidente?Gestione "sicura" di un Mutex?
Inoltre, come gestirò un arresto anomalo dell'altro processo, che potrebbe non aver ancora rilasciato il mutex? Devo gestire AbandonedMutexException ogni volta che chiamo mutex.WaitOne()?
In questo momento sto facendo simile a questo:
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 è un MemoryMappedViewAccessor ho un'istanza prima. L'intero metodo GetState() viene chiamato ogni frame come parte di un ciclo di gioco, quindi circa ogni millisecondo.
PS: Inoltre, c'è qualche altro ovvio problema perché questo potrebbe fallire, che non ho già menzionato?
"non scrivere programmi che si bloccano mai" o, come ha detto il maestro Zen, "Evita errori". Ottimo consiglio. ahem. – mickeyf
Tuttavia, non sembra molto robusto né realistico. Cosa succede se l'utente semplicemente uccide il processo tramite il task manager, bloccando forzatamente l'app? – Mario
@ Mario: Non so cosa pensi non sia realistico; Ti assicuro che questi tipi di bug di corruzione dei dati vengono rilevati frequentemente e devono essere protetti se ti interessa lo stato dei dati dell'utente. Ri: cosa succede se l'utente si blocca l'applicazione? Mi stai chiedendo cosa succede quando l'utente fa cose che corrompono i propri dati? ** I loro dati vengono corrotti **, ecco cosa. Gli utenti che non vogliono che i loro dati siano corrotti ** non dovrebbero prendere in giro le loro app **. C'è un * motivo * per cui così facendo si apre una finestra di dialogo che dice "potresti corrompere i tuoi dati se lo fai". –