Ich lese ständig von einer Speicherabbilddatei, in die ein anderer Prozess schreibt, und benutze einen Mutex, um diesen Vorgang zu synchronisieren. In meinen paar Tests funktioniert das bisher gut, aber ... was passiert, wenn meine Anwendung direkt nach dem Erwerb des Mutex abstürzt und bevor er veröffentlicht wird? Gibt es eine Möglichkeit, eine Freigabe des Mutex auch im Falle eines solchen Absturzes zu garantieren?
Wie würde ich auch einen Absturz des anderen Prozesses behandeln, der den Mutex noch nicht freigegeben hat? Muss ich jedes Mal, wenn ich mutex.WaitOne () anrufe, mit AbandonedMutexException umgehen?
Im Moment mache ich es ähnlich:
%Vor%_mmView ist ein MemoryMappedViewAccessor, den ich zuvor instanziiert habe. Diese ganze Methode GetState () ruft jeden Frame als Teil einer Spielschleife auf, also etwa alle paar Millisekunden.
PS: Gibt es noch ein anderes offensichtliches Problem, warum das scheitern könnte, das habe ich nicht schon erwähnt?
Eugens Antwort ist richtig - das Betriebssystem wird den Mutex für Sie freigeben. Denken Sie jetzt darüber nach, was die Konsequenzen dieser Tatsache sind:
Kurz gesagt, Sie sorgen sich um genau das Falsche. Du solltest dir keine Sorgen machen über was passiert, wenn mein Mutex nie freigegeben wird. Das Schlimmste, was dann passiert, ist, dass jeder ewig wartet, was traurig ist, aber letztendlich wird der Benutzer es tun Starten Sie den Computer neu. Sie sollten sich Sorgen um machen, was passiert, wenn Mutex freigegeben wird, weil ich auf halber Strecke durch eine Mutation abgestürzt bin . In diesem Szenario werden Prozesse jetzt wahrscheinlich überall abstürzen und die Daten des Benutzers werden dauerhaft beschädigt .
Kommen Sie nicht zuerst in diese Situation. Die Lösung für das Problem ist Absturz nicht, wenn Sie einen Mutex zum Schreiben entfernt haben. Wenn Sie keine Programme schreiben, die abstürzen, brauchen Sie sich keine Gedanken darüber zu machen, denn das wird nicht passieren. Also schreibe einfach keine Programme, die jemals abstürzen.
Wenn ein Prozess endet, während er einen Mutex besitzt, gibt das Betriebssystem den Mutex automatisch für Sie frei. Probieren Sie dies aus, indem Sie den Mutex und dann raise new WhateverException()
- der andere Prozess wird fortgesetzt.
Das Gleiche gilt für alle Synchronisationsgrundelemente AFAIK
Tags und Links c# memory-mapped-files mutex