GameServer以前访问DBcenter时同步的,这样服务器都要等待DBcenter返回结果,经理在DBcenter和GameServer之间加了一个asynDBCenter,就实现了异步,感觉还是很复杂,当然经理就20分钟搞定的事,主要函数:

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::push_cmd(CmdPkt pkt)
{
{
std::unique_lock<std::mutex> cond_lock(m_cond_mtx);//外层就是对应下面的wait操作,这样就实现了线程同步,当有数据时就通知,免得搞个循环判断
{
std::unique_lock<std::mutex> cmd_lock(m_cmd_mtx);
m_queueCmdPkt.push(pkt);
}
}
m_cond.notify_one();//通知threadLoop线程工作
}
void asynDBCenter::push_hr(HrPkt pkt)
{
std::unique_lock<std::mutex> hr_lock(m_hr_mtx);
m_queueHrPkt.push(pkt);
} //------------------------------------------------------------------------------------------------------------------
void asynDBCenter::drive()
{ HrPkt pkt;
for (;;)
{
if(!m_queueHrPkt.size())
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());
}
}
void asynDBCenter::threadLoop()
{
while()
{
CmdPkt pkt;
if(get_front_and_pop(pkt))//上了把cmd包的锁,保护包,获取请求cmd包
{
pkt.process(pkt.on_process, pkt.json.c_str());//根据cmd请求,访问数据库
continue;
}
{//条件等待
std::unique_lock<std::mutex> cond_lock(m_cond_mtx);
m_cond.wait(cond_lock);//有通知时就解锁
} }
}

这里面只要是两个线程共享的变量就需要加锁,也许不加锁,但时间长的话都可能报错。

std::unique_lock<std::mutex> cond_lock(m_cond_mtx);
m_cond.wait(cond_lock);
这个是线程同步的东西,等待其他线程有数据了调用Notify_one就可以唤醒了,wait在阻塞是解锁,在唤醒时锁住,这样都是为了只有一个线程访问公共变量,内部的各种包都需要同步

asynDBCenter(不断跟新)的更多相关文章

  1. 读书笔记:《HTML5开发手册》--HTML5新的结构元素

    读书笔记:<HTML5开发手册> (HTML5 Developer's CookBook) 虽然从事前端开发已有很长一段时间,对HTML5标签也有使用,但在语义化上面理解还不够清晰.之前在 ...

  2. UWP中新加的数据绑定方式x:Bind分析总结

    UWP中新加的数据绑定方式x:Bind分析总结 0x00 UWP中的x:Bind 由之前有过WPF开发经验,所以在学习UWP的时候直接省略了XAML.数据绑定等几个看着十分眼熟的主题.学习过程中倒是也 ...

  3. “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)

    前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...

  4. 一次修改闭源 Entity Provider 程序集以兼容新 EntityFramework 的过程

    读完本文你会知道,如何在没有源码的情况下,直接修改一个 DLL 以去除 DLL 上的强命名限制,并在该程序集上直接添加你的“友元程序集(一种特殊的 Attribute,将它应用在程序集上,使得程序集内 ...

  5. 最新 去掉 Chrome 新标签页的8个缩略图

    chrome的新标签页的8个缩略图实在让人不爽,网上找了一些去掉这个略缩图的方法,其中很多已经失效.不过其中一个插件虽然按照原来的方法已经不能用了,但是稍微变通一下仍然是可以用的(本方法于2017.1 ...

  6. SQL Server 2014 新特性——内存数据库

    SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...

  7. HTML5 input元素新的特性

    在HTML5中,<input>元素增加了许多新的属性.方法及控件.本文章分别对这三方面进行介绍. 目录 1. 属性 2. 方法 3. 新控件 1. 属性 <input>元素在H ...

  8. ElasticSearch 5学习(10)——结构化查询(包括新特性)

    之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...

  9. CoreCRM 开发实录——开始之新项目的技术选择

    2016年11月,接受了一个工作,是对"悟空CRM"进行一些修补.这是一个不错的 CRM,开源,并提供一个 SaaS 的服务.正好微软的 .NET Core 和 ASP.NET C ...

随机推荐

  1. C#指南,重温基础,展望远方!(8)C#数组

    数组是一种数据结构,其中包含许多通过计算索引访问的变量. 数组中的变量(亦称为数组的元素)均为同一种类型,我们将这种类型称为数组的元素类型. 数组类型是引用类型,声明数组变量只是为引用数组实例预留空间 ...

  2. Ubuntu 14.10 -- 异次元软件世界

    Ubuntu 14.10 中文桌面版/服务器正式版下载 - 华丽免费易于入门的 Linux 操作系统 [ 系统工具 - Linux // 2014-10-25 ]     一说到 Linux,就不得不 ...

  3. C++ 资源管理之 RAII

    RAII,它是“Resource Acquisition Is Initialization”的首字母缩写.也称为“资源获取就是初始化”,是c++等编程语言常用的管理资源.避免内存泄露的方法.它保证在 ...

  4. SortedDictionary<TKey,TValue>正序与反序排序及Dicttionary相关

    SortedDictionary<TKey,TValue>能对字典排序 using System; using System.Collections.Generic; using Syst ...

  5. mysql-connector-python 源码安装

    一.下载mysql-connector-python的源码包: 下载页面: https://dev.mysql.com/downloads/connector/python/ 我这下载的是mysql- ...

  6. Atitit.Gui控件and面板----db数据库区----- .数据库比较同步工具 vOa

    Atitit.Gui控件and面板----db数据库区----- .数据库比较同步工具 vOa 1. 咨微海信数据库应用 工具 1 2. 数据库比较工具 StarInix SQL Compare    ...

  7. linux性能不好怎么办?对着清单撸一遍

    性能不好怎么办?对着清单撸一遍 Brendan Gregg是Netflix的资深性能架构师,著名性能调优专家.著有<性能之巅:洞悉系统.企业与云计算>)一书,可以说是性能调优领域的集大成之 ...

  8. HTTP 403详解

    1.什么是Http 403错误Http协议中对403错误定义如下The server understood the request, but is refusing to fulfill it. Au ...

  9. jvm垃圾收集器之Throughput GC

    呃.HotSpot VM的GC组老人之一Jon Masamitsu很久之前就写过blog讲解这个:https://blogs.oracle.com/jonthecollector/entry/our_ ...

  10. Java 之泛型通配符 ? extends T 与 ? super T 解惑

    简述 大家在平时的工作学习中, 肯定会见过不少如下的语句: List<? super T> List<? extends T> 我们都知道, 上面的代码时关于 Java 泛型的 ...