#include <condition_variable>
using namespace std;
class Foo {
std::mutex _mutex;
int _butler = 'a';
std::condition_variable _cv;
public:
Foo() { }
void first(function<void()> printFirst) {
std::lock_guard<std::mutex> lock(_mutex);
_butler = 'b';
printFirst();
_cv.notify_all();
}
void second(function<void()> printSecond) {
std::unique_lock<std::mutex> lk(_mutex);
_cv.wait(lk, [this] { return _butler == 'b'; });
_butler = 'c';
printSecond();
lk.unlock();
_cv.notify_one();
}
void third(function<void()> printThird) {
std::unique_lock<std::mutex> lk(_mutex);
_cv.wait(lk, [this] { return _butler == 'c'; });
printThird();
lk.unlock();
}
};