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.
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.
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
.
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.
Tags und Links c# multithreading locking critical-section