C ++ observatørmønster via boost.signals2

Jeg ledte efter en trådsikker implementering af observatørmønsteret. Jeg læste https://xinhuang.github.io/posts/2015-02-11-how-a-multi-threaded-implementation-of-the-observer-pattern-can-fail.html og tænkte på punkt 4 “Don t genopfinde hjulet, brug Boost.Signals2 i stedet” Så jeg prøvede følgende kode og ville spørge, om det er sikkert at blive brugt i et multitrådet program? Hvad sker der, hvis en Observer destrueres under 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(); } 

Svar

Boost.Signals2 er en tråd -sikkert bibliotek. Det bruger mutex-låsning internt. Der er nogle advarsler som forklaret i denne artikel :

Næsten alle klasser leveret af Boost.Signals2 er trådsikre og kan bruges i flertrådede applikationer. F.eks. objekter af typen boost::signals2::signal og boost::signals2::connection kan tilgås fra forskellige tråde.

På den anden side er boost::signals2::shared_connection_block ikke trådsikker. Denne begrænsning er ikke vigtig, fordi flere objekter o f type boost::signals2::shared_connection_block kan oprettes i forskellige tråde og kan bruge det samme forbindelsesobjekt.

men i dens enkleste og standardformularer, Boost.Signals2 er sikker med flere tråde.

Dit givne eksempel er faktisk trådsikkert.

Hvad sker der, hvis en observatør ødelægges under notifyObservers?

Sloten frakobles forebyggende.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *