Kann auf eine Listt von mehreren Threads zugegriffen werden?

7

Ich plane, eine Liste zwischen mehreren Threads zu teilen. Die Liste wird während einer Änderung gesperrt, die selten auftritt. Gibt es ein Threadsicherheitsproblem, wenn mehrere Iterationen von verschiedenen Threads gleichzeitig durch die Liste durchgeführt werden?

    
bkarj 21.12.2010, 21:58
quelle

4 Antworten

10

Wenn Sie können (wenn Sie .NET 4 verwenden können), verwenden Sie BlockingCollection<T> :

  

Bietet Blockierungs- und Begrenzungsfunktionen für threadsichere Sammlungen, die IProducerConsumerCollection<T> implementieren.

Wenn nicht, dann kapseln Sie die Liste vollständig ein und fügen Sie thread-sichere Methoden hinzu, die auf den List<T>'s -Zustand zugreifen. Machen Sie den Verweis auf die Liste nicht öffentlich oder geben Sie ihn nicht aus anderen Methoden zurück - kapseln Sie den Verweis immer ein, damit Sie sicherstellen können, dass Sie alle Zugriffe darauf sperren.

    
Andrew Hare 21.12.2010, 22:00
quelle
6

Ein List<T> ist keine Thread-sichere Klasse, aber wenn Sie jedes Mal sperren lesen / schreiben, es wird keine Probleme geben. Laut der Dokumentation:

  

Öffentlich statisch (in Visual Basic freigegeben)   Mitglieder dieses Typs sind Thread-sicher.   Alle Instanzmitglieder sind es nicht   garantiert fadensicher.

     

A List<T> kann mehrere Leser unterstützen   gleichzeitig, solange die   Sammlung wird nicht geändert.   Aufzählung durch eine Sammlung ist   Eigentlich kein Thread-Safe   Verfahren. In dem seltenen Fall, wo ein   Aufzählung streitet mit einem oder mehreren   Schreibzugriffe, der einzige Weg, um sicherzustellen   Fadensicherheit ist das zu sperren   Sammlung während des gesamten   Aufzählung. Um die Sammlung zu ermöglichen   Zugriff auf mehrere Threads für   Lesen und Schreiben, du musst   Implementieren Sie Ihre eigene Synchronisation.

    
Darin Dimitrov 21.12.2010 22:00
quelle
4

List<T> ist im Allgemeinen nicht Thread-sicher. Wenn mehrere Reader vorhanden sind, treten keine Probleme auf. Sie können jedoch nicht in die Liste schreiben, während sie gelesen wird. Sie müssten also sowohl lesen als auch schreiben oder etwas wie System.Threading.ReaderWriterLock verwenden (das mehrere Leser, aber nur einen Schreiber erlaubt).

    
Harry Steinhilber 21.12.2010 22:04
quelle
1

Es kann gelesen werden von mehreren Threads gleichzeitig, wenn das ist, was Sie fragen. Betrachten Sie eine Leser-Schreiber-Sperre, falls dies der Fall ist.

    
Gabe 21.12.2010 22:02
quelle