Verwendung mehrerer Variablen für einen Sperrbereich in C #

8

Ich habe eine Situation, in der ein Codeblock nur dann ausgeführt werden sollte, wenn zwei Schließfachobjekte frei sind.

Ich hatte gehofft, dass es so etwas wie:

geben würde %Vor%

Aber so etwas scheint es nicht zu geben. Also bedeutet es, dass der einzige Weg dies zu tun ist:

%Vor%

Funktioniert das sogar wie erwartet? Obwohl der Code kompiliert, aber ich bin mir nicht sicher, ob es erreichen würde, was ich es erwarte.

    
Shamim Hafiz 20.05.2010, 13:17
quelle

3 Antworten

5

Ich würde es erwarten, obwohl es einen Fall geben könnte, in dem es möglicherweise zu einem Deadlock kommen könnte.

Normalerweise wird der Code versuchen, a zu sperren und dann% ce_de% zu sperren, wenn das erfolgreich war. Dies bedeutet, dass der Code nur ausgeführt wird, wenn er sowohl b als auch a sperren kann. Welches ist was du willst.

Wenn jedoch ein anderer Code bereits eine Sperre für b hat, wird dieser Code nicht das tun, was Sie erwarten. Sie müssen auch sicherstellen, dass Sie überall, wo Sie b und a sperren müssen, versuchen, die Sperren in derselben Reihenfolge zu erhalten. Wenn Sie b zuerst und dann b erhalten, würden Sie einen Deadlock verursachen.

    
ChrisF 20.05.2010, 13:21
quelle
15
%Vor%

Dies könnte blockieren, bis der Thread die Sperre für a übernehmen kann. Mit dem erworbenen Schloss würde es dann blockieren, bis der Thread die Sperre für b erlangen kann. Das funktioniert also wie erwartet.

Allerdings müssen Sie darauf achten, dies nicht woanders zu tun:

%Vor%

Dies könnte zu einer Deadlock-Situation führen, in der Thread 1 die Sperre für a erworben hat und darauf wartet, die Sperre für b zu erhalten, und Thread 2 die Sperre für b erworben hat und auf die Übernahme wartet die Sperre für a .

    
dtb 20.05.2010 13:22
quelle
11

Das Anfordern der Sperre für beide sollte gut funktionieren. lock(a) wird blockiert, bis a frei ist. Sobald Sie diese Sperre haben, wird lock(b) blockieren, bis Sie b haben. Danach haben Sie beide.

Eine Sache, die Sie hier sehr vorsichtig sein müssen, ist die Reihenfolge. Wenn Sie dies tun, stellen Sie sicher, dass Sie immer die Sperre für a erhalten, bevor Sie die Sperre für b erhalten. Sonst könnten Sie sich sehr schnell in einer Sackgasse befinden.

    
Herms 20.05.2010 13:20
quelle