9 explicit ThreadPool(
const uint16_t numThreads) : m_WorkerCount(numThreads) {
10 for (uint16_t i = 0; i < numThreads; ++i) {
11 m_Workers.emplace_back([
this] {
13 std::function<void()> task;
15 std::unique_lock lock(this->m_QueueMutex);
16 this->m_Condition.wait(lock, [
this] {
17 return this->m_Stop || !this->m_Tasks.empty();
20 if (this->m_Stop && this->m_Tasks.empty()) {
24 task = std::move(this->m_Tasks.front());
62 std::future<std::invoke_result_t<F, Args...>>
Submit(F&& f, Args&&... args) {
63 using ReturnType = std::invoke_result_t<F, Args...>;
65 auto task = std::make_shared<std::packaged_task<ReturnType()>>(
66 std::bind(std::forward<F>(f), std::forward<Args>(args)...)
69 std::future<ReturnType> res = task->get_future();
72 std::unique_lock lock(m_QueueMutex);
75 throw std::runtime_error(
"Submit on stopped ThreadPool");
78 m_Tasks.emplace([task]() { (*task)(); });
80 m_Condition.notify_one();