Sie müssen auch beim Lesen sperren, oder Sie erhalten unzuverlässige Daten oder sogar eine Ausnahme, wenn eine gleichzeitige Änderung die Zieldatenstruktur physisch ändert.
In dem obigen Fall müssen Sie sicherstellen, dass mehrere Threads nicht versuchen, den Wert zur gleichen Zeit hinzuzufügen, so dass Sie mindestens eine Lesesperre benötigen, während Sie überprüfen, ob es bereits vorhanden ist. Andernfalls könnten mehrere Threads entscheiden, hinzuzufügen, finden Sie den Wert nicht vorhanden (da diese Prüfung nicht gesperrt ist), und dann alle versuchen, der Reihe nach hinzufügen (
) Sie könnten ein ReaderWriterLockSlim verwenden, wenn Sie viele haben liest und nur ein paar schreibt. In dem obigen Code würden Sie die Lesesperre erwerben, um die Überprüfung durchzuführen und auf eine Schreibsperre zu aktualisieren, sobald Sie entscheiden, dass Sie sie hinzufügen müssen. In den meisten Fällen wird nur eine Lesesperre benötigt (die es Ihren Leser-Threads ermöglicht, noch parallel zu laufen).
Es gibt eine Zusammenfassung der verfügbaren .Net 4-Sperrgrundelemente here. Auf jeden Fall sollten Sie dies verstehen, bevor Sie sich mit Multithread-Code beschäftigen. Die Auswahl des richtigen Sperrmechanismus kann einen enormen Leistungsunterschied bewirken.
Sie haben Recht, dass Sie bisher Glück gehabt haben - das ist ein häufiges Merkmal von Nebenläufigkeitsfehlern. Sie sind oft ohne gezielte Belastungstests schwer zu reproduzieren, was bedeutet, dass ein korrektes Design (und erschöpfende Tests natürlich) unerlässlich ist, um peinliche und verwirrende Produktionsfehler zu vermeiden.
Großen Link für alle verfügbaren Verriegelungsmechanismen. Ich hatte nur von 'Schloss' gehört. – MyNameIsJob
Viel Glück - wenn Sie dieses Zeug meistern können, werden Sie in einer kleinen Minderheit von Entwicklern sein, die auf eine Zunahme der Multicore-Entwicklung gut vorbereitet sind. –