#pragma once #include #include #include #include #include #include #include #include #include class ThreadPool { private: std::vector threads; std::queue> queue; std::mutex mut; std::condition_variable cv; bool exit = false; public: ThreadPool(size_t size) { for (size_t i = 0; i < size; i++) { threads.emplace_back([this] { while (true) { std::function func; std::unique_lock lock(mut); cv.wait(lock, [this] { return exit || !queue.empty(); }); if (exit && queue.empty()) return; func = std::move(queue.front()); queue.pop(); lock.unlock(); func(); } }); } } ~ThreadPool() { exit = true; mut.lock(); mut.unlock(); cv.notify_all(); for (auto &thread : threads) { if (thread.joinable()) { thread.join(); } } } size_t queue_size() { std::unique_lock lock(mut); return queue.size(); } template auto add(T&& func, Args&&... args) -> std::future::type> { using ret_t = typename std::result_of::type; auto task = std::make_shared>( std::bind(std::forward(func), std::forward(args)...)); std::future fut = task->get_future(); std::unique_lock lock(mut); queue.emplace([task] () { (*task)(); }); lock.unlock(); cv.notify_one(); return fut; } };