/** ******************************************* * @file libcpu/threadPool/include/thread_pool.hpp * @version 1.0 * @date 8-December-2024 * @brief thread pool * @note https://git.leshe4ka.ru/leshe4ka/oop24/src/branch/lab3/3 ******************************************* */ #ifndef THREAD_POOL_HPP_INC_ #define THREAD_POOL_HPP_INC_ #include "vector/vector.hpp" // IWYU pragma: export #include #include #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export namespace cpu_n { // template class MyBind { // public: // explicit MyBind(F &&f, Args &&...args) // : f_(std::forward(f)), // args_(std::make_tuple(std::forward(args)...)) {} // auto operator()() { return std::apply(f_, args_); } // private: // std::function()> f_; // std::tuple args_; // }; class ThreadPool { public: // NOLINTNEXTLINE ThreadPool(uint64_t threads = std::thread::hardware_concurrency()); ~ThreadPool(); void start(); template auto enqueue(F &&f, Args &&...args) -> std::future { if (worker_count->load() != workers.size()) { start(); } auto func = [f = std::forward(f), ... args = std::forward(args)]() mutable { return f(args...); }; auto encapsulated_ptr = std::make_shared>(func); // auto task = std::packaged_task(func); std::future future_object = encapsulated_ptr->get_future(); // std::future future_object = task.get_future(); { std::lock_guard lock(*mutexPtr); queue.emplace([encapsulated_ptr](){ (*encapsulated_ptr)();}); // queue.emplace([t = std::move(task)]() mutable { t(); }); } cvPtr->notify_one(); return future_object; } ThreadPool(const ThreadPool &) = delete; ThreadPool(ThreadPool &&o) noexcept = default; ThreadPool &operator=(const ThreadPool &) = delete; ThreadPool &operator=(ThreadPool &&o) = default; [[nodiscard]] auto threadsNum() const { return threads; } [[nodiscard]] auto started() const { return started_state; } private: vec::vector workers; std::vector worker_up; std::unique_ptr> worker_count; std::unique_ptr mutexPtr; std::unique_ptr cvPtr; std::queue,std::list>> queue; void worker(uint64_t thread_id); bool stop; uint64_t threads; bool started_state = false; }; } // namespace cpu_n #endif