#pragma once /** * @file async_db_worker.h * @brief 全局单例后台线程,异步执行 DB2 写入,避免阻塞 mon 20ms 周期 * * 去重机制:同一 rule_id 重复 submit 时,旧任务被覆盖(只保留最新快照)。 * 进程退出时必须在其他单例析构前调用 drain_and_stop()。 * * @author your name (you@domain.com) * @version 0.1 * @date 2026-05-13 */ #include #include #include #include #include #include #include #include class AsyncDbWorker { public: static AsyncDbWorker &instance(); /// 提交任务;同 rule_id 覆盖旧任务(去重) void submit(const std::string &rule_id, std::function task); /// 排空队列并停止线程(进程退出前调用) void drain_and_stop(); private: AsyncDbWorker(); ~AsyncDbWorker(); std::unique_ptr worker_; std::mutex mtx_; std::condition_variable cv_; std::unordered_map> pending_; std::atomic running_{true}; void loop(); };