Frage

Wie lange wird ein Thread Warten auf eine Race-Bedingung in dem folgende Szenario?

Eine Datei zu einer Sammlung hinzugefügt:

 lock(mylock)
 {
     // add to collection
 }

Es wird dann aus der Sammlung in einer ähnlichen Art und Weise entfernt werden.

Wenn ein Thread zur Sammlung hinzuzufügen versucht, während der Dienst aus der Sammlung zu entfernen, wer gewinnt?

Oder ist das der Punkt einer Race-Bedingung, Sie können nicht vorhersagen, wer gewinnt?

War es hilfreich?

Lösung

Wenn das Entfernen Faden zuerst zu sperren versucht, besitzt er die Sperre, entfernt das Element (falls vorhanden), die Sperre, und bewegt sich auf. Dann wird das Hinzufügen Faden greift das Schloss und fügt das Element. Endergebnis:. Artikel existiert nicht in der Sammlung

Wenn das Hinzufügen Faden zuerst zu sperren versucht, besitzt er die Sperre, fügt das Element aus, löst die Verriegelung, und bewegt sich auf. Dann wird das Entfernen Gewinde greift die Sperre und entfernt das (just-hinzugefügt) Element. Endergebnis:. Element nicht gibt es in der Sammlung

Weder Thread länger warten als nötig ist, hinzuzufügen oder ein Element aus der Sammlung zu entfernen.

Andere Tipps

Wie der Name schon sagt, eine Race-Bedingung bedeutet, dass es ein Rennen auf, und jeder konnte gewinnen!

Mit lock(obj) wie Sie hier gezeigt haben, wird den Faden verursachen blockieren (Wartezeit), bis die alle anderen Threads auf obj ihre Sperre wieder freigeben. Dies kann nie passieren.

lock (obj)
{
    // stuff
}

... entspricht ...

Monitor.Enter(obj);
try
{
    // stuff
}
finally
{
    Monitor.Exit(obj);
}

Wenn Sie ein Timeout erzwingen auf Sperren, benutzen Sie diese Form statt:

if (!Monitor.TryEnter(obj, timeout))
{
    // handle the fact that you couldn't lock
}
else
{
    try
    {
        // stuff
    }
    finally
    {
        Monitor.Exit(obj);
    }
}

Unabhängig davon, welcher Thread gibt die Sperre zunächst gewinnen. Zweiter Thread wartet, bis die erste die Sperre freigibt.

Es gibt eine andere Art von Racebedingung zwischen der ‚wenn‘ und ‚versuchen‘. Wenn beispielsweise der Faden genau zwischen dann abgebrochen wird, verlässt es den Abschnitt des Codes verriegelt. Ich glaube nicht, dass der Punkt Ihrer Frage war, aber es ist immer noch ein Problem drin.

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