#include #include #include #include #include #include /** * 异步任务执行类,它的主要作用是让任务都在一个后台线程中排队执行,避免业务代码中到处加锁 */ class AsyncWorker { public: AsyncWorker() : done(false) { worker_thread = std::thread(&AsyncWorker::workerLoop, this); } ~AsyncWorker() { { std::lock_guard lock(queue_mutex); done = true; } cond_var.notify_all(); if (worker_thread.joinable()) { worker_thread.join(); } } template auto postTask(Func task) -> std::future { using result_type = decltype(task()); auto packaged_task = std::make_shared>(task); std::future result = packaged_task->get_future(); { std::lock_guard lock(queue_mutex); task_queue.push([packaged_task] { (*packaged_task)(); }); } cond_var.notify_one(); return result; } private: void workerLoop() { while (true) { std::function task; { std::unique_lock lock(queue_mutex); cond_var.wait(lock, [this] { return !task_queue.empty() || done; }); if (done && task_queue.empty()) { return; } task = std::move(task_queue.front()); task_queue.pop(); } task(); } } std::thread worker_thread; std::queue> task_queue; std::mutex queue_mutex; /* * 根据 cppreference 的说法,std::condition_variable 只能 std::unique_lock 的情况下生效, * 这里采用 std::condition_variable_any * The condition_variable_any class is a generalization of std::condition_variable. * Whereas std::condition_variable works only on std::unique_lock, * condition_variable_any can operate on any lock that meets the BasicLockable requirements. */ std::condition_variable_any cond_var; std::atomic done; };