#include <atomic>
#include <thread>
#include <iostream>
#include <condition_variable>
class WorkerControl
{
public:
void Suspend()
{
sleep_ = true;
};
void Resume()
{
sleep_ = false;
cv_.notify_one();
};
void Exit()
{
exit_ = true;
};
std::atomic_bool sleep_{ false };
std::condition_variable cv_{};
std::atomic_bool exit_{ false };
std::mutex mutex_{};
};
void Worker(WorkerControl& control)
{
std::unique_lock lk(control.mutex_);
while (!control.exit_.load()) {
if (!control.sleep_.load()) {
std::cout << ".";
std::this_thread::sleep_for(std::chrono::milliseconds(500)); // Do something
}
else {
std::cout << "\n" << "enters sleep" << "\n";
control.cv_.wait(lk, [&control]() { return control.sleep_.load() == false; });
std::cout << "wakes up" << "\n";
}
}
std::cout << "\n" << "exits" << "\n";
}
int main()
{
WorkerControl control{};
std::thread tr(Worker, std::ref(control));
// For example:
std::this_thread::sleep_for(std::chrono::seconds(5)); // (Wait 5 secons)
control.Suspend();
std::this_thread::sleep_for(std::chrono::seconds(3)); // (Wait 3 seconds)
control.Resume();
std::this_thread::sleep_for(std::chrono::seconds(10)); // (Wait 10 seconds)
control.Suspend();
std::this_thread::sleep_for(std::chrono::seconds(3)); // (Wait 3 seconds)
control.Resume();
std::this_thread::sleep_for(std::chrono::seconds(5)); // (Wait 5 seconds)
control.Exit();
tr.join();
}