2015-10-15 12:58:16 +02:00
|
|
|
#pragma once
|
|
|
|
#ifndef MESSMER_CPPUTILS_LOCK_CONDITIONBARRIER_H
|
|
|
|
#define MESSMER_CPPUTILS_LOCK_CONDITIONBARRIER_H
|
2015-10-03 01:23:39 +02:00
|
|
|
|
|
|
|
#include <mutex>
|
|
|
|
#include <condition_variable>
|
|
|
|
|
|
|
|
//TODO Test
|
2015-11-07 09:00:25 +01:00
|
|
|
//TODO Merge lock folder with thread folder
|
2015-10-03 01:23:39 +02:00
|
|
|
|
|
|
|
namespace cpputils {
|
|
|
|
// Like a condition variable, but without spurious wakeups.
|
|
|
|
// The waiting threads are only woken, when notify() is called.
|
|
|
|
// After a call to release(), future calls to wait() will not block anymore.
|
|
|
|
class ConditionBarrier {
|
|
|
|
public:
|
|
|
|
ConditionBarrier() :_mutex(), _cv(), _triggered(false) {
|
|
|
|
}
|
|
|
|
|
|
|
|
void wait() {
|
|
|
|
std::unique_lock<std::mutex> lock(_mutex);
|
|
|
|
_cv.wait(lock, [this] {
|
|
|
|
return _triggered;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
void release() {
|
|
|
|
std::unique_lock<std::mutex> lock(_mutex);
|
|
|
|
_triggered = true;
|
|
|
|
_cv.notify_all();
|
|
|
|
}
|
|
|
|
private:
|
|
|
|
std::mutex _mutex;
|
|
|
|
std::condition_variable _cv;
|
|
|
|
bool _triggered;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|