In einem digitalen Signalerfassungssystem werden Daten oft in einem Beobachter im System um einen Thread verschoben.Entwurfsmuster für Multithread-Beobachter
Beispiel aus Wikipedia/Observer_pattern:
foreach (IObserver observer in observers)
observer.Update(message);
Wenn z.B. eine Benutzeraktion von z.B. Ein GUI-Thread erfordert, dass die Daten nicht mehr fließen, dass Sie die Subjekt-Beobachter-Verbindung unterbrechen und sogar den Beobachter insgesamt entsorgen wollen.
Man kann argumentieren: Sie sollten nur die Datenquelle stoppen, und warten Sie auf einen Sentinel-Wert der Verbindung zu entsorgen. Aber das würde mehr Latenz im System verursachen.
Natürlich, wenn die Daten Pump Thread ist nur für die Adresse des Betrachters gefragt, könnte es findet es eine Nachricht an ein zerstörtes Objekt sendet.
Hat jemand ein "offizielles" Designmuster erstellt, das dieser Situation entgegenwirkt? Sollten sie nicht?
Ich bin hier irgendwie verwirrt. Was versuchst du zu vermeiden?Sprechen Sie über einen Fall, in dem ein Thread die Registrierung eines Beobachters aufheben möchte, aber ein anderer Thread über alle Beobachter iteriert? –
Ich weiß nicht, welche konkrete Klasse Sie implementieren "IObserver" aber wenn "Update" bedeutet "tun, was Sie tun müssen, um sich mit einer Datenquelle auf dem neuesten Stand zu bringen", dann wäre das richtige Verhalten für ein Objekt angeordnet schweigend nichts tun. Wenn jedem Beobachter ein Objekt zugeordnet ist, das angibt, ob Subskriptionen weiterhin empfangen werden sollen und ob das pumpende Objekt ein Flag hat, das anzeigt, ob solche Objekte seit dem letzten Scanvorgang eine Abmeldung angefordert haben, kann der pumpende Thread Objekte für Subskriptionen abfragen wenn gebraucht. – supercat