class thread_pool { thread_safe_queue pool_work_queue; typedef std::queue local_queue_type; static thread_local std::unique_ptr local_work_queue; void worker_thread() { local_work_queue.reset(new local_queue_type); while (!done) { run_pending_task(); } } public: template std::future::type> submit(FunctionType f) { typedef std::result_of::type result_type; std::packaged_task task(f); std::future res(task.get_future()); if (local_work_queue) { local_work_queue->push(std::move(task)); } else { pool_work_queue.push(std::move(task)); } return res; } void run_pending_task() { function_wrapper task; if (local_work_queue && !local_work_queue->empty()) { task = std::move(local_work_queue->front()); local_work_queue->pop(); task(); } else if (pool_work_queue.try_pop(task)) { task(); } else { std::this_thread::yield(); } } // rest as before };