TaskHandle enqueueTask(const Task::TaskFunction& function, const ProblemSpace& problemSpace) { Task task(function, problemSpace); std::unique_lock<std::mutex> lock(m_queueMutex); m_tasks.emplace(std::move(task)); TaskHandle handle(m_tasks.back()); m_queueSemaphore.notify(); if (!m_running) { for (unsigned int i = 0; i < std::thread::hardware_concurrency(); i++) { m_threads.emplace_back(std::bind(&ThreadPool::threadFunction, this)); } m_running = true; } return handle; }