#include <chrono>
#include <condition_variable>
#include <iostream>
#include <memory>
#include <mutex>
#include <stdexcept>
#include <thread>
struct Blocker
{
Blocker() :
wait_thread([this]() {
std::mutex mtx;
std::unique_lock<std::mutex> lck(mtx);
cond.wait(lck);
})
{
}
void wait()
{
wait_thread.join();
}
void notify()
{
cond.notify_one();
}
std::condition_variable cond;
std::thread wait_thread;
};
template<typename Callback>
void async_operation(const Callback & cb) { cb(); }
int main()
{
Blocker b;
async_operation([&](){ b.notify(); });
b.wait();
std::cout << "End of program." << std::endl;
}
I2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8bXV0ZXg+CiNpbmNsdWRlIDxzdGRleGNlcHQ+CiNpbmNsdWRlIDx0aHJlYWQ+CgoKc3RydWN0IEJsb2NrZXIKewogICAgQmxvY2tlcigpIDoKICAgICAgICB3YWl0X3RocmVhZChbdGhpc10oKSB7CiAgICAgICAgICAgIHN0ZDo6bXV0ZXggbXR4OwogICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxjayhtdHgpOyAgICAgICAgICAgIAogICAgICAgICAgICBjb25kLndhaXQobGNrKTsKICAgICAgICB9KQogICAgewogICAgfQoKICAgIHZvaWQgd2FpdCgpCiAgICB7CiAgICAgICAgd2FpdF90aHJlYWQuam9pbigpOwogICAgfQoKICAgIHZvaWQgbm90aWZ5KCkKICAgIHsKICAgICAgICBjb25kLm5vdGlmeV9vbmUoKTsKICAgIH0KICAgIAogICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgY29uZDsgICAgCiAgICBzdGQ6OnRocmVhZCB3YWl0X3RocmVhZDsKfTsKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBDYWxsYmFjaz4Kdm9pZCBhc3luY19vcGVyYXRpb24oY29uc3QgQ2FsbGJhY2sgJiBjYikgeyBjYigpOyB9CgoKaW50IG1haW4oKQp7CiAgICBCbG9ja2VyIGI7CiAgICBhc3luY19vcGVyYXRpb24oWyZdKCl7IGIubm90aWZ5KCk7IH0pOwogICAgYi53YWl0KCk7CiAgICAKICAgIHN0ZDo6Y291dCA8PCAiRW5kIG9mIHByb2dyYW0uIiA8PCBzdGQ6OmVuZGw7Cn0=