MEL
Microthread & Execution library
Barrier.h
1 #pragma once
2 #include <core/CallbackSubscriptor.h>
3 #include <memory>
4 namespace mel
5 {
6  namespace parallelism
7  {
8  class Barrier;
10  class MEL_API BarrierData : private mel::core::CallbackSubscriptor<mel::core::CSNoMultithreadPolicy,const BarrierData&>,
11  public std::enable_shared_from_this<BarrierData>
12  {
13  friend class ::mel::parallelism::Barrier;
14  typedef CallbackSubscriptor<::mel::core::CSNoMultithreadPolicy,const BarrierData&> Subscriptor;
15  private:
16  BarrierData(size_t nWorkers):mActiveWorkers(nWorkers){}
17  void set();
18  inline size_t getActiveWorkers() const { return mActiveWorkers; }
19  template <class F> auto subscribeCallback(F&& f)
20  {
21  volatile auto protectMe = shared_from_this();
22  std::scoped_lock<std::mutex> lock(mCS);
23  if (mActiveWorkers==0)
24  f(*this);
25  return Subscriptor::subscribeCallback(std::forward<F>(f));
26  }
27  template <class F> auto unsubscribeCallback(F&& f)
28  {
29  std::scoped_lock<std::mutex> lock(mCS);
30  return Subscriptor::unsubscribeCallback(std::forward<F>(f));
31  }
32  protected:
33  size_t mActiveWorkers;
34  std::mutex mCS;
35 
36  };
38 
42  class MEL_API Barrier
43  {
44  public:
45  explicit Barrier( size_t nWorkers = 0 ):mData( new BarrierData( nWorkers ) )
46  {
47  }
48  Barrier( const Barrier& o2):mData(o2.mData){ }
49  Barrier( Barrier&& o2):mData(std::move(o2.mData)){}
50  Barrier& operator=(const Barrier& o2){mData = o2.mData;return *this;}
51  Barrier& operator=(Barrier&& o2){mData = std::move(o2.mData);return *this;}
52  // inline void addWorkers(size_t nWorkers)
53  // {
54  // mData->addWorkers(nWorkers);
55  // }
59  inline void set()
60  {
61  mData->set();
62  }
63  inline size_t getActiveWorkers() const
64  {
65  return mData->getActiveWorkers();
66  }
67  template <class F> auto subscribeCallback(F&& f) const
68  {
69  return const_cast<BarrierData*>(mData.get())->subscribeCallback(std::forward<F>(f));
70  }
71  template <class F> auto unsubscribeCallback(F&& f) const
72  {
73  const_cast<BarrierData*>(mData.get())->unsubscribeCallback(std::forward<F>(f));
74  }
75  private:
76  std::shared_ptr<BarrierData> mData;
77  protected:
78  Barrier( BarrierData* data );
79 
80  };
81  }
82 }
Definition: CallbackSubscriptor_Impl.h:454
Multithread barrier.
Definition: Barrier.h:43
void set()
Definition: Barrier.h:59
Definition: Callback_Impl.h:11