#include #include #include #include #include #include #include #include #include struct ThreadPool { public: using Job = std::function; ThreadPool(unsigned int nof_threads) : nof_threads(nof_threads), finished(false), threads(nof_threads) { for (auto& t: threads) { t = std::thread([=]() { process_jobs(); }); } } ~ThreadPool() { { std::unique_lock lock(mutex); finished = true; } cv.notify_all(); for (auto& t: threads) { t.join(); } } void submit(Job job) { std::unique_lock lock(mutex); jobs.push_back(std::move(job)); cv.notify_one(); } private: unsigned int nof_threads; bool finished; std::vector threads; 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() { ThreadPool pool(2); pool.submit([]() { std::printf("Hi, this is your first job!\n"); }); pool.submit([]() { std::fprintf(stderr, "Now you get another job.\n"); }); }