2 #include <core/CallbackSubscriptor.h>
11 public std::enable_shared_from_this<BarrierData>
13 friend class ::mel::parallelism::Barrier;
14 typedef CallbackSubscriptor<::mel::core::CSNoMultithreadPolicy,const BarrierData&> Subscriptor;
16 BarrierData(
size_t nWorkers):mActiveWorkers(nWorkers){}
18 inline size_t getActiveWorkers()
const {
return mActiveWorkers; }
19 template <
class F>
auto subscribeCallback(F&& f)
21 volatile auto protectMe = shared_from_this();
22 std::scoped_lock<std::mutex> lock(mCS);
23 if (mActiveWorkers==0)
25 return Subscriptor::subscribeCallback(std::forward<F>(f));
27 template <
class F>
auto unsubscribeCallback(F&& f)
29 std::scoped_lock<std::mutex> lock(mCS);
30 return Subscriptor::unsubscribeCallback(std::forward<F>(f));
33 size_t mActiveWorkers;
45 explicit Barrier(
size_t nWorkers = 0 ):mData(
new BarrierData( nWorkers ) )
50 Barrier& operator=(
const Barrier& o2){mData = o2.mData;
return *
this;}
51 Barrier& operator=(
Barrier&& o2){mData = std::move(o2.mData);
return *
this;}
63 inline size_t getActiveWorkers()
const
65 return mData->getActiveWorkers();
67 template <
class F>
auto subscribeCallback(F&& f)
const
69 return const_cast<BarrierData*
>(mData.get())->subscribeCallback(std::forward<F>(f));
71 template <
class F>
auto unsubscribeCallback(F&& f)
const
73 const_cast<BarrierData*
>(mData.get())->unsubscribeCallback(std::forward<F>(f));
76 std::shared_ptr<BarrierData> mData;
78 Barrier( BarrierData* data );
Definition: CallbackSubscriptor_Impl.h:454
Multithread barrier.
Definition: Barrier.h:43
void set()
Definition: Barrier.h:59
Definition: Callback_Impl.h:11