"Sicheres" Handling eines Mutex?

8

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?

    
Mario 06.02.2012, 23:27
quelle

2 Antworten

11

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:

  • Sie haben den Mutex ausgeschaltet, um sicherzustellen, dass niemand während des Lesens den Status ändern würde, oder Sie lesen den Status, während Sie mutieren. Nehmen wir das letztere an.
  • Eine andere Anwendung möchte den Status lesen, also versucht sie, den Mutex zu übernehmen. Es ist gezwungen zu warten.
  • Du hast einen Zustand mutiert und bist dann abgestürzt.
  • Das Betriebssystem hat den Mutex freigegeben.
  • Die andere Anwendung erhält jetzt sofort den Mutex und liest jetzt effektiv den Status "während" ein anderer Prozess sie mutiert . Die Tatsache, dass der andere Prozess nun tot und vorbei ist, bedeutet, dass der betrügerische Zustand nun für immer andauert und der Lesevorgang wird wahrscheinlich selbst zum Absturz bringen und schrecklich sterben. Sie haben gerade das Sicherheitssystem des Mutex besiegt .

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.

    
Eric Lippert 06.02.2012, 23:48
quelle
2

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

    
Eugen Rieck 06.02.2012 23:34
quelle

Tags und Links