2009-03-12 4 views
2

Code erforderlich, die nicht die Auswirkungen auf Sammlung Mutual Exclusion mussMutual Exclusion

List<string> _itemColection = new List<string>(); 
    object _criticalSection = new object(); 

    private void Add(string item) 
    { 
     lock (_criticalSection) 
     { 
      _itemColection.Add(item); 
     } 
    } 

    private void Remove(string item) 
    { 
     lock (_criticalSection) 
     { 
      _itemColection.Remove(item); 
     } 
    } 

    private void GetCount() 
    { 
     ///Is it lock is reuired here? 
     return _itemColection.Count; 
    } 

    //Thread method 
    private void Run() 
    { 
     lock (_criticalSection) 
     { 

      foreach (string item in _itemColection) 
      { 
       ///Some operation 
      } 
     } 
    } 

Ist es Mutex in GetCount erforderlich ist() -Methode. Die Sammlungswerte werden nicht geändert

Antwort

4

Ja, Sie sollten dort sperren. Sie fordern den Zugriff auf freigegebene Daten an, und wenn Sie keine Speicherbarriere haben, gibt es keine Garantie, dass es sich um "frische" Informationen handelt. Das Speichermodell manchmal ein echtes Geist-bender sein kann :)

Darüber hinaus, während ich erwarten würdeList<T>.Count eine ziemlich einfache Bedienung sein, es könnte theoretisch kompliziert sein - und wenn ein anderen Thread Sachen mutiert (z. B. Hinzufügen eines Elements, das dann eine Puffererweiterung erfordert), während es die Zählung ausarbeitet, könnten Sie theoretisch in Schwierigkeiten geraten.

Grundsätzlich, es sei denn, ein Typ behauptet zu Thread-Safe für Ihr spezielles Szenario, würde ich immer sicherstellen, dass Sie nicht zwei Operationen auf ihm gleichzeitig ausführen.

0

Einfache Antwort ist ja, weil die Werte möglicherweise geändert werden und Sie nicht über aktuelle Daten verfügen.

0

, das eine ausgezeichnete Frage zu concurency ist ..

Meiner Meinung nach ist es immer notwendig, Sperre zu verwenden, wenn Sie in Anwesenheit von etwas Gleichzeitigkeit sind.

EDIT

Wir verwenden Sperre nur in Operationen, die einige Informationen ändern müssen, und müssen nie schreibgeschützt in verwenden, um Objekte.

Mit freundlichen Grüßen

+0

Es sei denn, Sie * wissen *, dass Ihre beteiligten Typen für Ihre Operationen threadsafe sind - z. Zeichenketten oder * nur * Lesen in einem Wörterbuch, das einmal statisch eingerichtet und nie geändert wurde. –

+0

Genau ... das scheint mir offensichtlich. Ich denke, wir verwenden nur Lock-In-Operationen, die einige Informationen ändern müssen. Ich habe vergessen, das auf meiner Antwort zu sagen. – rpf

1

In der Praxis ist es wahrscheinlich nicht nötig, aber ich würde es mich auf der sicheren Seite zu sein. _itemCollection.Count ist eine Eigenschaft, also rufen Sie effektiv eine Funktion für die Sammlung auf, und Sie haben keine Garantie, was diese Funktion macht.

Verwandte Themen