Ich habe eine Situation in C#, wo ich eine Liste von einfachen Typen habe. Auf diese Liste kann von mehreren Threads zugegriffen werden: Einträge können hinzugefügt oder entfernt werden, und das Vorhandensein eines Eintrags kann überprüft werden. Ich habe die Liste in einem Objekt verkapselt, das bisher nur diese drei Operationen offenlegt.C# Concurrent List Fragen
Ich habe ein paar Fälle zu behandeln (nicht genau die gleichen wie die Methoden, die ich gerade erwähnt habe).
1. Ein Thread kann nur auf das Vorhandensein eines Eintrags prüfen. (einfach)
2. Ein Thread kann nach dem Vorhandensein eines Eintrags suchen, und falls dieser nicht existiert, fügen Sie ihn hinzu.
3. Ein Thread muss prüfen, ob ein Eintrag vorhanden ist, und wenn dies der Fall ist, warten Sie, bis er entfernt wurde.
4. Eine Kombination von 2 und 3, bei der ein Thread nach dem Vorhandensein eines Eintrags sucht, falls dieser existiert, muss er warten, bis er entfernt wird, bevor er ihn selbst hinzufügen kann.
Die ganze Idee ist, dass die Existenz eines Eintrags eine Sperre bedeutet. Wenn ein Eintrag vorhanden ist, kann das Objekt, das er identifiziert, nicht geändert werden, und der Code kann nicht fortgesetzt werden, da er an anderer Stelle geändert wird.
Das mag wie eine einfache Anfänger Situation erscheinen, aber ich bin auf Nebenläufigkeit Probleme und es macht mich ein bisschen paranoid, und ich bin auch nicht so vertraut mit C# Nebenläufigkeit Mechanismen.
Was wäre der beste Weg, damit umzugehen? Bin ich total ausgeschaltet? Sollte check und add (test und set?) Zu einer vierten atomaren Operation kombiniert werden? Würde ich meinen Methoden einfach Sperrblöcke hinzufügen, auf die die Liste zugreift?
Ist es auch möglich, Einheiten dieser Art zu testen (nicht die einfachen Operationen, die Nebenläufigkeitssituationen)?
+1, kam ich zu einer ähnlichen Lösung, aber die HashSet macht sie effizienter. Nette Demo für die Monitor-Klasse, mit verschachtelten Locks etc. Nur ein Problem kann ein "Ansturm" sein, wenn ein Gegenstand entfernt wird. –