45 lines
1.1 KiB
C
45 lines
1.1 KiB
C
|
|
#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 <atomic>
|
|||
|
|
#include <condition_variable>
|
|||
|
|
#include <functional>
|
|||
|
|
#include <memory>
|
|||
|
|
#include <mutex>
|
|||
|
|
#include <string>
|
|||
|
|
#include <thread>
|
|||
|
|
#include <unordered_map>
|
|||
|
|
|
|||
|
|
class AsyncDbWorker {
|
|||
|
|
public:
|
|||
|
|
static AsyncDbWorker &instance();
|
|||
|
|
|
|||
|
|
/// 提交任务;同 rule_id 覆盖旧任务(去重)
|
|||
|
|
void submit(const std::string &rule_id, std::function<void()> task);
|
|||
|
|
|
|||
|
|
/// 排空队列并停止线程(进程退出前调用)
|
|||
|
|
void drain_and_stop();
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
AsyncDbWorker();
|
|||
|
|
~AsyncDbWorker();
|
|||
|
|
|
|||
|
|
std::unique_ptr<std::thread> worker_;
|
|||
|
|
std::mutex mtx_;
|
|||
|
|
std::condition_variable cv_;
|
|||
|
|
std::unordered_map<std::string, std::function<void()>> pending_;
|
|||
|
|
std::atomic<bool> running_{true};
|
|||
|
|
|
|||
|
|
void loop();
|
|||
|
|
};
|