#pragma once #include #include #include #include #include #include namespace pixelarium::utils { class simple_thread_pool { public: explicit simple_thread_pool(size_t); simple_thread_pool(simple_thread_pool&) = delete; simple_thread_pool(const simple_thread_pool&) = delete; simple_thread_pool(simple_thread_pool&&) = delete; simple_thread_pool& operator=(simple_thread_pool&) = delete; simple_thread_pool& operator=(simple_thread_pool&&) = delete; ~simple_thread_pool(); template requires std::invocable static auto run_asynch(Callable&& fun) -> void { simple_thread_pool::Global().enqueue(std::forward(fun)); } public: template requires std::invocable auto enqueue(Callable&& fun) -> void { { std::unique_lock lck(thread_mutex_); task_queue_.emplace(std::forward(fun)); } cv_.notify_one(); } private: static auto Global() -> simple_thread_pool& { const auto kThreadCount{std::thread::hardware_concurrency() * 2}; static simple_thread_pool global_instance(kThreadCount == 0 ? 5 : kThreadCount); return global_instance; } std::vector workers_; std::condition_variable cv_; std::mutex thread_mutex_; std::queue> task_queue_; bool shutdown_{false}; }; } // namespace pixelarium::utils