C++ 多线程编程总结 在开发 C++程序时,一般在吞吐量、并发、实时性上有较高的要求。设计 C++程序时,总结起来可以从如下几点提高效率:l 并发l 异步l 缓存下面将我平常工作中遇到一些问题例举一二,其设计思想无非以上三点。1 任务队列1.1 以生产者-消费者模型设计任务队列 生产者-消费者模型是人们非常熟悉的模型,比如在某个服务器程序中,当 User 数据被逻辑模块修改后,就产生一个更新数据库的任务(produce),投递给 IO 模块任务队列,IO 模块从任务队列中取出任务执行 sql 操作(consume)。 设计通用的任务队列,示例代码如下: 详细实现可参见: ffown.googlecode./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_##_msg(long uid, const ##_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_##_msg(long uid, const ##_msg_t& msg) { logic_task_queue_array[uid % sizeof(logic_task_queue_array)]->post( boost::bind(&servie_t::proces, uid, msg));}注意,此模式下为多任务队列,每个任务队列单线程。1.2.3 连接池与异步回调 比...