Frage

Ich habe eine Situation, wo ein Codeblock sollte nur, wenn zwei Umkleide Objekte sind frei ausgeführt werden.

Ich habe es gehofft, wäre so etwas wie:

lock(a,b)
{
    // this scope is in critical region
} 

Allerdings scheint es nichts so zu sein. So ist es der einzige Weg, bedeutet dies zu tun ist:

lock(a)
{
    lock(b)
    {
        // this scope is in critical region
    }
}

Wird dies auch wie erwartet? Obwohl der Code kompiliert, aber ich bin nicht sicher, ob es nicht erreichen, was ich erwarte es.

War es hilfreich?

Lösung

Ich würde erwarten, dass es zu, obwohl es einen Fall geben würde, wo es könnte möglicherweise Ursache einer Deadlock-Bedingung.

Normalerweise wird der Code Lock a versuchen und dann Sperre b vorgehen, wenn das gelungen. Dies bedeutet, dass es würde nur den Code ausführen, wenn es sowohl a und b sperren könnte. Das ist, was Sie wollen.

Wenn jedoch ein anderer Code bereits eine Sperre auf b bekam dann wird dieser Code nicht tun, was Sie erwarten. Sie würden auch, dass müssen sicherstellen, überall Sie sowohl a zu sperren benötigt und b Sie die Schlösser in der gleichen Reihenfolge zu bekommen versuchen. Wenn Sie b zuerst und dann a einen Deadlock verursachen würde.

Andere Tipps

lock(a) lock(b) { // this scope is in critical region }

Dies könnte blockieren würde, bis der Thread die Sperre für a erwerben kann. Dann mit der Sperre erworben, wäre es blockiert, bis der Thread die Sperre für b erwerben kann. So Dies funktioniert wie erwartet.

Allerdings müssen Sie vorsichtig sein, nicht das irgendwo anderes zu tun:

lock(b) lock(a) { // this scope is in critical region }

Dies könnte zu einer Deadlock-Situation führen, in dem Thread 1 die Sperre für a erworben hat, und wartet die Sperre für b zu erwerben, und Faden 2 hat die Sperre für b erworben und wartet die Sperre für a zu erwerben.

Anfordern die 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 brauchen etwa hier sehr vorsichtig sein, ist die Reihenfolge. Wenn Sie vorhaben, dies zu tun, machen Sie sicher, dass immer die Sperre auf a erhalten, bevor die Sperre auf b bekommen. Sonst könnte man sehr leicht, sich in einer Deadlock-Situation.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top