Wir müssen ein .NET Int32 sperren, wenn wir es in einem Multithread-Code lesen?

Ich habe den folgenden Artikel gelesen:http: //msdn.microsoft.com/en-us/magazine/cc817398.asp "Lösen von 11 wahrscheinlichen Problemen in Ihrem Multithread-Code" von Joe Duffy

Und es stellte sich mir die Frage: "Wir müssen ein .NET Int32 sperren, wenn wir es in einem Multithread-Code lesen?"

Ich verstehe, dass wenn es ein Int64 in einem 32-Bit-SO wäre, es reißen könnte, wie es im Artikel erklärt wird. Aber für Int32 habe ich mir folgende Situation vorgestellt:

class Test
{
  private int example = 0;
  private Object thisLock = new Object();

  public void Add(int another)
  {
    lock(thisLock)
    {
      example += another;
    }
  }

  public int Read()
  {
     return example;
  }
}

Ich sehe keinen Grund, eine Sperre in die Read-Methode aufzunehmen. Machst du

Aktualisiere Basierend auf den Antworten (von Jon Skeet und ctacke) verstehe ich, dass der obige Code immer noch für Multiprozessor-Caching anfällig ist (jeder Prozessor hat seinen eigenen Cache, der nicht mit anderen synchronisiert ist). Alle drei unten aufgeführten Änderungen beheben das Problem:

Zu "int example" die Eigenschaft "volatile" hinzufügen Einfügen eines Thread.MemoryBarrier (); vor dem eigentlichen Lesen von "int example"Lesen Sie "int example" in einem "lock (thisLock)"

Und ich denke auch, dass "volatile" die eleganteste Lösung ist.

Antworten auf die Frage(12)

Ihre Antwort auf die Frage