C ++ observatørmønster via boost.signals2 (Norsk)

Jeg lette etter en trådsikker implementering av observatørmønsteret. Jeg leste https://xinhuang.github.io/posts/2015-02-11-how-a-multi-threaded-implementation-of-the-observer-pattern-can-fail.html og tenkte på punkt 4 «Ikke oppfinne hjulet på nytt, bruk Boost.Signals2 i stedet» Så jeg prøvde følgende kode og ville spørre om det er trygt å bli brukt i et flertrådet program? Hva skjer hvis en Observer blir ødelagt 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. Den bruker mutex-låsing internt. Det er noen advarsler, som forklart i denne artikkelen :

Nesten alle klasser levert av Boost.Signals2 er trådsikre og kan brukes i flertrådede applikasjoner. For eksempel objekter av typen boost::signals2::signal og boost::signals2::connection kan nås fra forskjellige tråder.

På den annen side er boost::signals2::shared_connection_block ikke trådsikker. Denne begrensningen er ikke viktig fordi flere objekter o f type boost::signals2::shared_connection_block kan opprettes i forskjellige tråder og kan bruke samme tilkoblingsobjekt.

men i dens enkleste og standard skjema, Boost.Signals2 er trygt for flere tråder.

Det gitte eksemplet ditt er faktisk trådsikkert.

Hva skjer hvis en observatør blir ødelagt under notifyObservers?

Sporet er frakoblet.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *