在开发C++程序时,一般在吞吐量、并发、实时性上有较高的要求。设计C++程序时,总结起来可以从如下几点提高效率:
● l 并发
● l 异步
● l 缓存
下面将我平常工作中遇到一些问题例举一二,其设计思想无非以上三点。
1任务队列
1.1 以生产者-消费者模型设计任务队列
生产者-消费者模型是人们非常熟悉的模型,比如在某个服务器程序中,当User数据被逻辑模块修改后,就产生一个更新数据库的任务(produce),投递给IO模块任务队列,IO模块从任务队列中取出任务执行sql操作(consume)。
设计通用的任务队列,示例代码如下:
详细实现可参见:
http://ffown.googlecode.com/svn/trunk/fflib/include/detail/task_queue_impl.h
- void task_queue_t::produce(const task_t& task_) {
- lock_guard_t lock(m_mutex);
- if (m_tasklist->empty()){//! 条件满足唤醒等待线程
- m_cond.signal();
- }
- m_tasklist->push_back(task_);
- }
- int task_queue_t::comsume(task_t& task_){
- lock_guard_t lock(m_mutex);
- while (m_tasklist->empty())//! 当没有作业时,就等待直到条件满足被唤醒{
- if (false == m_flag){
- return -1;
- }
- m_cond.wait();
- }
- task_ = m_tasklist->front();
- m_tasklist->pop_front();
- return 0;
- }
1.2 任务队列使用技巧
1.2.1 IO 与 逻辑分离
比如网络游戏服务器程序中,网络模块收到消息包,投递给逻辑层后立即返回,继续接受下一个消息包。逻辑线程在一个没有io操作的环境下运行,以保障实时性。示例:
- void handle_xx_msg(long uid, const xx_msg_t& msg){
- logic_task_queue->post(boost::bind(&servie_t::proces, uid, msg));
- }
注意,此模式下为单任务队列,每个任务队列单线程。
1.2.2 并行流水线
上面的只是完成了io 和 cpu运算的并行,而cpu中逻辑操作是串行的。在某些场合,cpu逻辑运算部分也可实现并行,如游戏中用户A种菜和B种菜两种操作是完全可以并行的,因为两个操作没有共享数据。最简单的方式是A、B相关的操作被分配到不同的任务队列中。示例如下:
- void handle_xx_msg(long uid, const xx_msg_t& msg) {
- logic_task_queue_array[uid % sizeof(logic_task_queue_array)]->post(
- boost::bind(&servie_t::proces, uid, msg));
- }
注意,此模式下为多任务队列,每个任务队列单线程。
1.2.3 连接池与异步回调
比如逻辑Service模块需要数据库模块异步载入用户数据,并做后续处理计算。而数据库模块拥有一个固定连接数的连接池,当执行SQL的任务到来时,选择一个空闲的连接,执行SQL,并把SQL 通过回调函数传递给逻辑层。其步骤如下:
●n 预先分配好线程池,每个线程创建一个连接到数据库的连接
●n 为数据库模块创建一个任务队列,所有线程都是这个任务队列的消费者
●n 逻辑层想数据库模块投递sql执行任务,同时传递一个回调函数来接受sql执行结果
示例如下:
- void db_t:load(long uid_, boost::functionpost(boost::bind(&db_t:load, uid, func));
注意,此模式下为单任务队列,每个任务队列多线程。
2. 日志
本文主要讲C++多线程编程,日志系统不是为了提高程序效率,但是在程序调试、运行期排错上,日志是无可替代的工具,相信开发后台程序的朋友都会使用日志。常见的日志使用方式有如下几种:
●n 流式,如logstream
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?