#include #include #include #include #include #include #include #include struct Worker { public: using Job = std::function; Worker() : finished(false) { t = std::thread([=]() { process_jobs(); }); } ~Worker() { { std::unique_lock lock(mutex); finished = true; } cv.notify_one(); t.join(); } void submit(Job job) { std::unique_lock lock(mutex); jobs.push_back(std::move(job)); cv.notify_one(); } private: bool finished; std::thread t; std::mutex mutex; std::condition_variable cv; std::list jobs; void process_jobs() { for(;;) { Job job; /* fetch job */ { std::unique_lock lock(mutex); if (jobs.empty() && !finished) { cv.wait(lock); } if (jobs.empty() && finished) break; job = std::move(jobs.front()); jobs.pop_front(); } /* execute job */ job(); } } }; int main() { Worker worker; worker.submit([]() { std::printf("Hi, this is your first job!\n"); }); worker.submit([]() { std::printf("Now you get another job.\n"); }); }