#include <atomic>
#include <thread>
#include <future>
struct ConditionEvent
{
ConditionEvent(bool initialCondition = false) :
condition(initialCondition)
{ }
void Set()
{
std::unique_lock<std::mutex> lock(mutex);
condition = true;
variable.notify_all();
}
void Reset()
{
std::unique_lock<std::mutex> lock(mutex);
condition = false;
}
void Wait()
{
std::unique_lock<std::mutex> lock(mutex);
variable.wait(lock, [this] { return IsSet(); });
}
bool IsSet()
{
return condition;
}
private:
std::atomic<bool> condition;
std::mutex mutex;
std::condition_variable variable;
};
int main()
{
ConditionEvent event;
auto f = std::async(std::launch::async, [&] { event.Set(); });
event.Wait();
f.get();
}
I2luY2x1ZGUgPGF0b21pYz4KI2luY2x1ZGUgPHRocmVhZD4KI2luY2x1ZGUgPGZ1dHVyZT4KCnN0cnVjdCBDb25kaXRpb25FdmVudAp7CiAgQ29uZGl0aW9uRXZlbnQoYm9vbCBpbml0aWFsQ29uZGl0aW9uID0gZmFsc2UpIDoKICAgIGNvbmRpdGlvbihpbml0aWFsQ29uZGl0aW9uKQogIHsgfQogIAogIHZvaWQgU2V0KCkKICB7CiAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CiAgICAgIGNvbmRpdGlvbiA9IHRydWU7CiAgICAgIHZhcmlhYmxlLm5vdGlmeV9hbGwoKTsKICB9CiAgCiAgdm9pZCBSZXNldCgpCiAgewogICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOwogICAgICBjb25kaXRpb24gPSBmYWxzZTsKICB9CiAgCiAgdm9pZCBXYWl0KCkKICB7CiAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CiAgICAgIHZhcmlhYmxlLndhaXQobG9jaywgW3RoaXNdIHsgcmV0dXJuIElzU2V0KCk7IH0pOwogIH0KICAKICBib29sIElzU2V0KCkKICB7CiAgICAgIHJldHVybiBjb25kaXRpb247CiAgfQogIApwcml2YXRlOgogICAgc3RkOjphdG9taWM8Ym9vbD4gY29uZGl0aW9uOwogICAgc3RkOjptdXRleCBtdXRleDsKICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIHZhcmlhYmxlOwp9OwoKaW50IG1haW4oKQp7CiAgICBDb25kaXRpb25FdmVudCBldmVudDsKICAgIAogICAgYXV0byBmID0gc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsIFsmXSB7IGV2ZW50LlNldCgpOyB9KTsKICAgIAogICAgZXZlbnQuV2FpdCgpOwogICAgZi5nZXQoKTsKfQ==