#include #include #include #include #include #include #include class ThreadPool { public: ThreadPool(size_t num_threads); ~ThreadPool(); void enqueue(std::function task); private: std::vector workers; std::queue> tasks; std::mutex queue_mutex; std::condition_variable condition; bool stop; }; ThreadPool::ThreadPool(size_t num_threads) : stop(false) { for (size_t i = 0; i < num_threads; ++i) { workers.emplace_back([this] { while (true) { std::function task; { std::unique_lock lock(this->queue_mutex); this->condition.wait(lock, [this] { return this->stop || !this->tasks.empty(); }); if (this->stop && this->tasks.empty()) { return; } task = std::move(this->tasks.front()); this->tasks.pop(); } task(); } }); } } ThreadPool::~ThreadPool() { { std::unique_lock lock(queue_mutex); stop = true; } condition.notify_all(); for (std::thread& worker : workers) { worker.join(); } } void ThreadPool::enqueue(std::function task) { { std::unique_lock lock(queue_mutex); if (stop) { throw std::runtime_error("enqueue on stopped ThreadPool"); } tasks.emplace(task); } condition.notify_one(); } int main() { ThreadPool pool(4); for (int i = 0; i < 8; ++i) { pool.enqueue([i] { std::cout << "Task " << i << " is running on thread " << std::this_thread::get_id() << '\n'; }); } return 0; }