Wie kann ich eine bedingte Sperre in C # schreiben?

7

Die Sache ist, dass ich die Lock-Anweisung verwendet habe, um einen kritischen Teil davon zu schützen mein Code, aber jetzt, ich weiß, ich könnte die gleichzeitige Ausführung von diesem kritischen Code erlauben, wenn einige Bedingungen erfüllt sind.
Gibt es eine Möglichkeit, das Schloss zu konditionieren?

    
sebagomez 28.10.2008, 12:50
quelle

7 Antworten

5
%Vor%     
Amy B 28.10.2008, 12:57
quelle
9

Ich denke, dass diese Frage "Rassenkondition" ruft. Was passiert, wenn sich die Bedingung kurz nach der Prüfung von "wahr" auf "falsch" ändert, aber bevor ein Thread in den kritischen Codeabschnitt eintritt? Oder während ein Thread gerade ausgeführt wird?

    
Tomalak 28.10.2008 12:59
quelle
7
%Vor%

BEARBEITEN: Ja, es gibt eine Race-Bedingung, es sei denn, Sie können sicherstellen, dass die Bedingung konstant ist, während Threads eingegeben werden.

    
marijne 28.10.2008 13:02
quelle
7

Ich bin kein Threading-Experte, aber es hört sich so an, als würden Sie nach etwas ähnlichem Ausschau halten (doppelt geprüftes Locking). Die Idee ist, den Zustand sowohl vor als auch nach dem Erfassen der Sperre zu überprüfen.

%Vor%     
user31934 28.10.2008 15:29
quelle
4

Um eine Race Condition zu vermeiden, wäre ich versucht, ein ReaderWriterLockSlim - behandeln Sie den gleichzeitigen Zugriff als Lesesperre und den exklusiven Zugriff als Schreibsperre. Auf diese Weise werden Sie, wenn sich die Bedingungen ändern, nicht mit irgendeinem unpassenden Code enden, der immer noch blind in der Region ausgeführt wird (unter der falschen Annahme, dass es sicher ist); ein bisschen ausführlich, aber (für Platz formatiert):

%Vor%     
Marc Gravell 28.10.2008 13:01
quelle
2

Verwenden Sie Double-checked locking pattern , wie oben vorgeschlagen. das ist der Trick IMO:)

stellen Sie sicher, dass Sie Ihr Sperrobjekt als statisch haben, wie im Beispiel von not.thave.dave.foley.myopenid.com aufgeführt.

    
Pure.Krome 10.11.2008 05:52
quelle
1

Ich schätze, Sie haben einen Code, der ungefähr so ​​aussieht:

%Vor%

Um dies zu konditionieren, könntest du das nicht einfach tun:

%Vor%

Sollte funktionieren, nicht?

    
noocyte 28.10.2008 12:58
quelle

Tags und Links