Pattern observer C ++ tramite boost.signals2

Stavo cercando unimplementazione thread-safe del pattern observer. Ho letto https://xinhuang.github.io/posts/2015-02-11-how-a-multi-threaded-implementation-of-the-observer-pattern-can-fail.html e stavo pensando al punto 4 “Non” reinventare la ruota, usa Boost.Signals2 invece ” . Quindi ho provato il seguente codice e volevo chiedere se è sicuro da usare in unapplicazione multithread? Cosa succede se un Observer viene distrutto durante 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(); } 

Answer

Boost.Signals2 è un thread -libreria sicura. Utilizza internamente il blocco mutex. Ci sono alcune avvertenze, come spiegato in questo articolo :

Quasi tutte le classi fornite da Boost.Signals2 sono thread-safe e possono essere utilizzate in applicazioni multithread. Ad esempio, oggetti di tipo boost::signals2::signal e boost::signals2::connection è accessibile da thread diversi.

Daltra parte, boost::signals2::shared_connection_block non è thread-safe. Questa limitazione non è importante perché più oggetti o Il tipo f boost::signals2::shared_connection_block può essere creato in thread diversi e può utilizzare lo stesso oggetto connessione.

ma nel suo Forme più semplici e predefinite, Boost.Signals2 è multi-threading sicuro.

Lesempio fornito è, in effetti, thread-safe.

Cosa succede se un Observer viene distrutto durante notifyObservers?

Lo slot viene disconnesso preventivamente.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *