class WriteDBUnit
: public ArrayBu
{
public:
typedef std::function<int(const std::string& msg)> HandleMessage;
//封装线程池中的对象需要执行的任务对象
typedef struct task
{
HandleMessage run; //函数指针,需要执行的任务
//char arg[1048576]; //参数
std::string arg;
task()
{
run = nullptr;
//memset(arg, 0, sizeof(arg));
}
}task_t;
//下面是线程池结构体
typedef struct threadpool
{
condition_t cd_task; //任务状态量
condition_t cd_thread; //线程状态量
std::queue<task_t> que_task;
std::set<pthread_t> ls_pthreadid;
int max_threads; //线程池最大线程数
bool quit; //是否退出标志
// 出任务数量
int pop_task_count;
// 休眠时间:秒
int writedb_thread_sleep;
threadpool()
{
pop_task_count = get_quote_server().config().quote_param_.pop_task_count;
writedb_thread_sleep = get_quote_server().config().quote_param_.writedb_thread_sleep;
condition_init(&cd_task);
condition_init(&cd_thread);
}
~threadpool()
{
condition_destroy(&cd_task);
condition_destroy(&cd_thread);
}
bool push_thread(pthread_t pid);
void pop_thread(pthread_t pid);
bool pop_task(std::list<task_t>& ls_task);
void push_task(const task_t& ptask)
{
que_task.push(ptask);
}
}threadpool_t;
public:
//线程池初始化
void threadpool_init(threadpool_t *pool, int threads);
//往线程池中加入任务
void threadpool_add_task(threadpool_t *pool, HandleMessage run, const std::string& arg);
//摧毁线程池
void threadpool_destroy(threadpool_t *pool);
WriteDBUnit(const std::string& name, int sessionid);
virtual ~WriteDBUnit();
virtual void init(const char* configfilepath);
virtual void OnReceive(int sessionid, int transactionid, const std::string& msg, long long timestamp);
virtual void OnEvent(int sessionid, int eventid);
private:
// 主从切换推送
int HandleSwitchMasterSlaveRtn(const std::string& msg);
// 保存合约
int HandleInstrumentRtn(const std::string& msg);
// 保存行情
int HandleQuoteRtn(const std::string& msg);
// 保存K线
int HandleKlineRtn(const std::string& msg);
// 保存逐笔行情
int HandleTickRtn(const std::string& msg);
private:
std::map< int, HandleMessage > map_handle_message_;
threadpool_t threadpool_;
// 写库线程数量
int writedb_thread_count_;
bool is_writedb_;
// 当前使用的bu号,0号bu使用
int use_bu_index_;
};