C ++ – Beobachtermuster über boost.signals2

Ich suchte nach einer thread-sicheren Implementierung des Beobachtermusters. Ich habe https://xinhuang.github.io/posts/2015-02-11-how-a-multi-threaded-implementation-of-the-observer-pattern-can-fail.html gelesen und über Punkt 4 nachgedacht. „Das Rad nicht neu erfinden, sondern Boost.Signals2 verwenden“ Also habe ich den folgenden Code ausprobiert und wollte fragen, ob die Verwendung in einer Multithread-Anwendung sicher ist. Was passiert, wenn eine Observer während notifyObservers?

#include <boost/signals2.hpp> #include <iostream> #include <string> class AbstractObserver { public: using SignalType = boost::signals2::signal<void()>; virtual ~AbstractObserver() = default; virtual void notify() = 0; void registerAtSubject(SignalType &sig) { connection_ = sig.connect([this]() { notify(); }); } private: boost::signals2::scoped_connection connection_; }; class Subject { AbstractObserver::SignalType sig_; public: void registerObserver(AbstractObserver &observer) { observer.registerAtSubject(sig_); } void notifyObservers() const { sig_(); } }; class Observer : public AbstractObserver { std::string id_; public: explicit Observer(std::string id) : id_(std::move(id)) {}; void notify() override { std::cout << "Observer " << id_ << " got notified" << std::endl; } }; int main() { Subject c; { Observer o2("B"); { Observer o1("A"); c.registerObserver(o1); c.notifyObservers(); c.registerObserver(o2); c.notifyObservers(); } c.notifyObservers(); } c.notifyObservers(); } 

Antwort

Boost.Signals2 ist ein Thread -sichere Bibliothek. Sie verwendet intern die Mutex-Sperre. Es gibt einige Einschränkungen, wie in dieses Artikels erläutert:

Fast alle von Boost.Signals2 bereitgestellten Klassen sind threadsicher und können in Multithread-Anwendungen verwendet werden. Beispielsweise Objekte vom Typ boost::signals2::signal und boost::signals2::connection kann von verschiedenen Threads aus aufgerufen werden.

Andererseits ist boost::signals2::shared_connection_block nicht threadsicher. Diese Einschränkung ist nicht wichtig, da mehrere Objekte vorhanden sind Ö f Typ boost::signals2::shared_connection_block kann in verschiedenen Threads erstellt werden und dasselbe Verbindungsobjekt verwenden.

aber in seiner Die einfachsten und standardmäßigsten Formulare, Boost.Signals2, sind Multithreading-sicher.

Ihr Beispiel ist in der Tat thread-sicher.

Was passiert, wenn ein Beobachter während notifyObservers zerstört wird?

Der Steckplatz wird präventiv getrennt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.