#pragma once #include "Containers/Array.h" #include "Containers/List.h" #include #include namespace Seele { class ThreadPool { public: ThreadPool(uint32 numWorkers = std::thread::hardware_concurrency() - 2); ~ThreadPool(); void runAndWait(List> functions); void runAsync(std::function func); void waitIdle(); private: struct TaskGroup { uint64 numRemaining = 0; }; struct QueueEntry { std::function func; TaskGroup* task = nullptr; }; std::mutex queueLock; std::condition_variable queueCV; std::atomic_uint32_t numWaiting = 0; std::condition_variable idleCV; List queue; void work(); Array workers; std::mutex taskLock; std::condition_variable completedCV; List runningTasks; bool running = true; }; ThreadPool& getThreadPool(); } // namespace Seele