ascs 简明开发教程(十二):查询优化、消息队列优化

31 篇文章 0 订阅
31 篇文章 1 订阅

QQ交流群:198941541

查询显然是容器上的操作,所以这里说的查询优化对server_base和multi_client_base类均有效。

查询除了大家熟悉的find,exist等调用外,do_something_to_all和do_something_to_one也算,如果你经常需要多线程查询,那么用共享锁是推荐的做法,前提是std::shared_mutex或者std::timed_shared_mutex可用。通过宏ASCS_SHARED_LOCK_TYPE定义共享锁的类型(比如std::shared_lock),通过宏ASCS_SHARED_MUTEX_TYPE定义可用于共享锁的mutex类型(比如std::shared_mutex),你无需考虑需要独占锁的情况,当object_pool需要独占锁的时候,会用std::unique_lock而不会受到你的宏的影响,因为std::shared_mutex也可以用于独占锁。

消息队列优化显然是socket上的操作,你可以通过模板参数或者宏ASCS_INPUT_QUEUE定义发送消息队列,通过模板参数或者宏ASCS_INPUT_CONTAINER定义发送消息队列所用的容器(同理还有ASCS_OUTPUT_QUEUE和ASCS_OUTPUT_CONTAINER用于接收消息队列和容器的定义)。其中容器必须是个仅带一个模板参数(即消息类型)的类,队列必须是个仅带两个模板参数(即容器类型和锁类型)的类。容器必须有如下接口(其实最好的办法就是编译,让编译器告诉你缺少什么接口),可以看出来它应该是链式的而不是连续内存比如std::vector(连续内存结构在保持效率的情况下你提供不了这些接口):

//Container must at least has following functions (like std::list):
// Container() and Container(size_t) constructor
// empty, must be thread safe, but doesn't have to be consistent
// clear
// swap
// template<typename T> emplace_back(const T& item), if you call direct_(sync_)send_msg which accepts other than rvalue reference
// template<typename T> emplace_back(T&& item)
// template<typename T> emplace_front(const T& item), if you call (sync_)resend_msg which accepts other than rvalue reference
// template<typename T> emplace_front(T&& item), if you call (sync_)resend_msg
// splice(iter, Container&)
// splice(iter, Container&, iter, iter)
// front
// pop_front
// back
// begin
// end

至于队列需要的接口,我没总结,你可以用上面的方法,就是编译你的自定义队列,编译器会告诉你缺少什么接口。个人推荐就用我提供的队列(queue)即可,它支持带锁和不带锁,于是有了下面的定义:

template<typename Container> using non_lock_queue = queue<Container, dummy_lockable>; //thread safety depends on Container
template<typename Container> using lock_queue = queue<Container, lockable>;

无锁队列要求必须多线程安全(或者不用队列,只有接收缓存队列可以不用,那就是用同步批量派发所有消息),引入自定义队列是为了支持有锁和无锁,引入自定义容器是为了使用不同的内存分配器,如果你没有这两项需求,不建议定制化队列或者容器。

上一篇:ascs 简明开发教程(11) 下一篇:ascs 简明开发教程(13)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值