asynDBCenter
asynDBCenter是GS和DBCenter之间的模块,有了他GS访问数据库就是异步的了,以前是同步的,加入某个操作很耗时那么GS就在那等待这个返回值。
.对于std::queue哪些情况要加锁,哪些不加
push、pop操作100%必须加锁,front和back操作是只读的,不会破坏状态,但是有读写顺序要求时还是要同步。
一般empty和size就不要锁了,对于锁 里面有两个容器
std::queue<CmdPkt> m_queueCmdPkt;//命令包容器
std::queue<HrPkt> m_queueHrPkt;//相应包容器 .m_queueCmdPkt这个容器是什么时候放入的呢?
玩家登录获取userid的函数
/*
std::condition_variable
进入时获得锁,wait时释放,当别人通知的时候重新获得
锁的状态在线程阻塞之前和阻塞之后相同
*/
void asynDBCenter::push_cmd(CmdPkt pkt)
{
{
std::unique_lock<std::mutex> cond_lock(m_cond_mtx);//这里加锁,主要还是同步,但没有多大意义,因为没有对公共的变量操作,不是很确定
{
std::unique_lock<std::mutex> cmd_lock(m_cmd_mtx);
m_queueCmdPkt.push(pkt);
}
}
m_cond.notify_one();//取的线程阻塞了,现在通知
} void asynDBCenter::getUserID(std::function<void(int hr)>* on_getUserID, char* userName)
{
boost::property_tree::ptree pt;
pt.put("userName", userName);
std::stringstream os;
boost::property_tree::write_json(os, pt); CmdPkt pkt;
pkt.json = os.str();
pkt.process = std::bind(&asynDBCenter::isGetUserID, this, ph::_1, ph::_2);
pkt.on_process = (void*)on_getUserID;
push_cmd(pkt);//此时放入
} .什么时候从m_queueCmdPkt容器获取
asynDBCenter::asynDBCenter()
{
m_dbcenter.reset(NEW(DBCenter));
m_spThread.reset(new std::thread(std::bind(&asynDBCenter::threadLoop, this)));
} bool asynDBCenter::get_front_and_pop(CmdPkt& pkt)
{
//对于这句不放到锁里面,我在想如果执行这句不为空,然后执行到下面的时候别的线程把他变成空了,岂不是错了
//但我看也就只有这一个对方在取,所以不放到锁里面也是可以的
if(m_queueCmdPkt.empty())
return false;
{
std::unique_lock<std::mutex> lock(m_cmd_mtx);
pkt = m_queueCmdPkt.front();
m_queueCmdPkt.pop();
}
return true;
} void asynDBCenter::threadLoop()
{
while()
{
CmdPkt pkt;
if(get_front_and_pop(pkt))
{
pkt.process(pkt.on_process, pkt.json.c_str());//访问数据库
continue;
}
{//表示GS发过来的命令没有了
std::unique_lock<std::mutex> cond_lock(m_cond_mtx);
m_cond.wait(cond_lock);//使用unique_lock锁住当前线程,然后另一个线程在相同的m_cond上调用notify时此线程才会解除阻塞
}
}
} .访问数据库 void asynDBCenter::push_hr(HrPkt pkt)
{
std::unique_lock<std::mutex> hr_lock(m_hr_mtx);
m_queueHrPkt.push(pkt);//直接放入
} void asynDBCenter::isGetUserID(void* on_process, const char* arg)
{
std::stringstream ros(arg);
boost::property_tree::ptree pt;
boost::property_tree::read_json(ros, pt);
std::string userName = pt.get<std::string>("userName"); int ret = m_dbcenter->getUserID(const_cast<char*>(userName.c_str())); boost::property_tree::ptree ret_pt;//将数据库返回的值封装成json
ret_pt.put("userID", ret);
std::stringstream wos;
boost::property_tree::write_json(wos, ret_pt);
//放到结果包里面去
HrPkt pkt;
pkt.hr = wos.str();
pkt.on_process = on_process;
pkt.process = std::bind(&asynDBCenter::onGetUserID, this, ph::_1, ph::_2);
push_hr(pkt);
} .函数回调
void asynDBCenter::drive()
{ HrPkt pkt;
for (;;)
{
if(!m_queueHrPkt.size())//drive一下就把m_queueHrPkt所有的命令都执行了
break ;
{
std::unique_lock<std::mutex> hr_lock(m_hr_mtx);
pkt = m_queueHrPkt.front();
m_queueHrPkt.pop();
}
pkt.process(pkt.on_process, pkt.hr.c_str(), pkt.len);
}
} for (;;)
{
procMapSendData();//test1 m_asyndb->drive();//这个是在gs里面drive的 bool hr = process_loop(pkt);
procMapSendData();
//......
}
GS线程发命令到asyn,asyn线程去访问数据库,然后GS线程去驱动,然后回调GS里面的函数
function在这里面起了很大的作用

asynDBcenter(复习)的更多相关文章

  1. iOS总结_UI层自我复习总结

    UI层复习笔记 在main文件中,UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil,即创建的是UIApplication类型的对象,此对象看成是 ...

  2. vuex复习方案

    这次复习vuex,发现官方vuex2.0的文档写得太简略了,有些看不懂了.然后看了看1.0的文档,感觉很不错.那以后需要复习的话,还是先看1.0的文档吧.

  3. 我的操作系统复习——I/O控制和系统调用

    上篇博客介绍了存储器管理的相关知识——我的操作系统复习——存储器管理,本篇讲设备管理中的I/O控制方式和操作系统中的系统调用. 一.I/O控制方式 I/O就是输入输出,I/O设备指的是输入输出设备和存 ...

  4. 复习(1)【Maven】

    终于开始复习旧知识了,有输入必然要有输出.输入和输出之间的内化过程尤为重要,在复习的同时,真正把学到的东西积淀下来,加深理解. Maven项目概念与配置 Maven是一个项目管理和综合工具.Maven ...

  5. 《CSS权威指南》基础复习+查漏补缺

    前几天被朋友问到几个CSS问题,讲道理么,接触CSS是从大一开始的,也算有3年半了,总是觉得自己对css算是熟悉的了.然而还是被几个问题弄的"一脸懵逼"... 然后又是刚入职新公司 ...

  6. JS复习--更新结束

    js复习-01---03 一 JS简介 1,文档对象模型 2,浏览器对象模型 二 在HTML中使用JS 1,在html中使用<script></script>标签 2,引入外部 ...

  7. jQuery 复习

    jQuery 复习 基础知识 1, window.onload $(function(){});   $(document).ready(function(){}); 只执行函数体重的最后一个方法,事 ...

  8. jQuery5~7章笔记 和 1~3章的复习笔记

    JQery-05 对表单和表格的操作及其的应用 JQery-06 jQuery和ajax的应用 JQery-07 jQuery插件的使用和写法 JQery-01-03 复习 之前手写的笔记.实在懒得再 ...

  9. HTML和CSS的复习总结

    HTML(Hypertext Markup Language)超文本标记语言:其核心就是各种标记!<html> HTML页面中的所有内容,都在该标签之内:它主要含<head>和 ...

随机推荐

  1. git merge 到 非当前 branch

    1. Add a remote alias for your local repository, ex: git remote add self file:///path/to/your/reposi ...

  2. iOS开发那些事-iOS应用本地化-文本信息本地化

    文本信息本地化在本地化工作中占有很大的比例.包括了:应用名称本地化.系统按钮和信息本地化,以及静态文本信息本地化. 系统按钮和信息本地化 还记得天气预报应用背后的“完成”按钮吗,它在中文环境下是“完成 ...

  3. OC2-xml文件解析

    <?xml version="1.0" encoding="UTF-8"?> <Students class="17班" ...

  4. OC3_协议关键字

    // // Student.h // OC3_协议关键字 // // Created by zhangxueming on 15/6/24. // Copyright (c) 2015年 zhangx ...

  5. JAVA(int...i)问题

    第一次看到这种写法,弄不明白到底会是神马结果,运行后才发现是这么的神奇. 无论你调用的方法中带几位参数,“hello”一直可以被输出.

  6. JSLint notepad++使用

    1.JSLint简介 JSLint定义了一组编码约定,这比ECMA定义的语言更为严格.这些编码约定汲取了多年来的丰富编码经验,并以一条年代久远的编程原则 作为宗旨:能做并不意味着应该做.JSLint会 ...

  7. ListView Web 服务器控件概述(MSDN)

    1: "折叠"图像"展开"图像"复制"图像"复制悬停"图像 全部折叠全部展开 代码:全部 代码:多个 代码:Visual ...

  8. Data truncated for column 错误

    今天插入mysql数据数据时,报错Data truncated for column.研究了一下原理是我数据的长途超出了该字段的最大长度,所以解决办法很简单,就是修改数据库中字段属性,使其长度增加即可 ...

  9. [转]Android在eclipse中的快捷键

    1.选中你要加注释的区域,用ctrl+shift+C 会加上//注释2.先把你要注释的东西选中,用shit+ctrl+/ 会加上/*    */注释3.要修改在eclispe中的命令的快捷键方式我们只 ...

  10. QA如何增强网站建设公司竞争力

    在上一篇文章<QA在网站建设公司中的作用>中我们已经详细说了QA的作用,不过有一点没有明确说明,也就是只有在超高速发展的网站建设公司中才会充分体现QA的价值.这并不是说在发展稳定的公司或低 ...