#include <iostream>
#include <chrono>
#include <thread>
#include <condition_variable>
#include <mutex>
const std::chrono::seconds MainDelay = std::chrono::seconds(5);
const std::chrono::seconds WorkerTimeResolution = std::chrono::seconds(2);
std::mutex cv_m;
std::condition_variable cv;
bool _execute = false;
void worker_thread() {
std::unique_lock<std::mutex> lk(cv_m);
while (cv.wait_for(lk,WorkerTimeResolution,[](){return _execute ;})) {
// do stuff as long _execute is true
std::cout << "Worker thread executing ..." << std::endl;
std::this_thread::sleep_for(WorkerTimeResolution);
}
}
int main() {
std::thread t(worker_thread);
_execute = true;
cv.notify_all();
for(int i = 0; i < 3; ++i) {
// Do other stuff, may be with more varying timing conditions ...
std::this_thread::sleep_for(MainDelay);
std::cout << "Main thread executing ..." << std::endl;
}
_execute = false;
cv.notify_all();
t.join();
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICNpbmNsdWRlIDxjaHJvbm8+CiAgICAjaW5jbHVkZSA8dGhyZWFkPgogICAgI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KICAgICNpbmNsdWRlIDxtdXRleD4KICAgIAogICAgY29uc3Qgc3RkOjpjaHJvbm86OnNlY29uZHMgIE1haW5EZWxheSA9IHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpOwogICAgY29uc3Qgc3RkOjpjaHJvbm86OnNlY29uZHMgIFdvcmtlclRpbWVSZXNvbHV0aW9uID0gc3RkOjpjaHJvbm86OnNlY29uZHMoMik7CiAgICBzdGQ6Om11dGV4IGN2X207CiAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjdjsKICAgIGJvb2wgX2V4ZWN1dGUgPSBmYWxzZTsKCiAgICB2b2lkIHdvcmtlcl90aHJlYWQoKSB7CiAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxrKGN2X20pOwogICAgICAgd2hpbGUgKGN2LndhaXRfZm9yKGxrLFdvcmtlclRpbWVSZXNvbHV0aW9uLFtdKCl7cmV0dXJuIF9leGVjdXRlIDt9KSkgewogICAgICAgICAgICAvLyBkbyBzdHVmZiBhcyBsb25nIF9leGVjdXRlIGlzIHRydWUKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJXb3JrZXIgdGhyZWFkIGV4ZWN1dGluZyAuLi4iIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKFdvcmtlclRpbWVSZXNvbHV0aW9uKTsKICAgICAgIH0gICAgIAogICAgfQoKICAgIGludCBtYWluKCkgewogICAgICAgIHN0ZDo6dGhyZWFkIHQod29ya2VyX3RocmVhZCk7CiAgICAgICAgX2V4ZWN1dGUgPSB0cnVlOwogICAgICAgIGN2Lm5vdGlmeV9hbGwoKTsKCiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgICAgICAvLyBEbyBvdGhlciBzdHVmZiwgbWF5IGJlIHdpdGggbW9yZSB2YXJ5aW5nIHRpbWluZyBjb25kaXRpb25zIC4uLgogICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoTWFpbkRlbGF5KTsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNYWluIHRocmVhZCBleGVjdXRpbmcgLi4uIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQogICAgICAgIF9leGVjdXRlID0gZmFsc2U7CiAgICAgICAgY3Yubm90aWZ5X2FsbCgpOwogICAgICAgIHQuam9pbigpOwogICAgfQ==