libcryfs/lock/ConditionBarrier.h

39 lines
969 B
C
Raw Normal View History

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
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