19 template <
class F,
class... Args>
20 auto enqueue(F&& f, Args&&... args) -> std::future<decltype(f(args...))>;
24 void update(
double delta_time)
override;
29 std::vector<std::thread> _workers;
30 std::queue<std::function<void()>> tasks;
32 std::mutex _queue_mutex;
33 std::condition_variable condition;
34 bool is_running =
false;
38 template <
class F,
class... Args>
40 #if defined(SDL_PLATFORM_EMSCRIPTEN)
41 LOG_INFO(
"ThreadPool not supported on Web builds.");
44 using return_type = decltype(f(args...));
46 auto task = std::make_shared<std::packaged_task<return_type()>>(
47 std::bind(std::forward<F>(f), std::forward<Args>(args)...)
50 std::future<return_type> res = task->get_future();
53 std::unique_lock lock(_queue_mutex);
55 throw std::runtime_error(
"ThreadPool isn't running, cannot enqueue new tasks.");
58 tasks.emplace([task]() { (*task)(); });
61 condition.notify_one();
Base class for all engine systems.
Definition: engine_sys.h:10
ThreadManager class.
Definition: thread_pool.h:14
void update(double delta_time) override
Definition: thread_pool.cpp:42
~ThreadManager() override
bool initialize() override
Definition: thread_pool.cpp:36
void shutdown() override
Definition: thread_pool.cpp:45
ThreadManager(size_t threads)
Definition: thread_pool.cpp:4
auto enqueue(F &&f, Args &&... args) -> std::future< decltype(f(args...))>
Definition: thread_pool.h:39
#define LOG_INFO(...)
INFO logging.
Definition: logging_sys.h:75