Boost.Asio是个非常易用的C++异步网络库,官方文档中一个示例是聊天服务,分为chat_message、chat_client、chat_server三个部分。chat_server的启动代码如下。

     if (argc < )
{
std::cerr << "Usage: chat_server <port> [<port> ...]\n";
return ;
} boost::asio::io_service io_service; chat_server_list servers;
for (int i = ; i < argc; ++i)
{
using namespace std; // For atoi.
tcp::endpoint endpoint(tcp::v4(), atoi(argv[i]));
chat_server_ptr server(new chat_server(io_service, endpoint));
servers.push_back(server);
} io_service.run();

  从中可以看出,输入多个端口号会启动多个chat_server,但只有一个io_service,也就是说多个chat_server中产生的异步任务handler被放入同一个任务队列(由唯一的io_service维护),这就相当于用一个线程同时处理多个聊天服务器,自然会对系统的性能产生影响。

  从io_service_pool这个示例中可以得到一点改进的启发,每个chat_server绑定一个io_service,每个io_service在一个独立的线程中运行,这样就能充分利用机器的多核性能,改进代码如下。

         if (argc < )
{
std::cerr << "Usage: chat_server <port> [<port> ...]\n";
return ;
} typedef boost::shared_ptr<boost::asio::io_service> io_service_ptr;
typedef std::list<io_service_ptr> io_service_list; chat_server_list servers;
io_service_list services;
for (int i = ; i < argc; ++i)
{
using namespace std; // For atoi.
tcp::endpoint endpoint(tcp::v4(), atoi(argv[i]));
io_service_ptr service(new boost::asio::io_service);
chat_server_ptr server(new chat_server(*service, endpoint));
services.push_back(service);
servers.push_back(server);
} std::vector<std::shared_ptr<std::thread> > threads;
for(auto service : services)
{
auto run_func = [](const io_service_ptr& ptr) {
return ptr->run();
};
std::function<std::size_t()> f = std::bind(run_func, service);
std::shared_ptr<std::thread> thread(new std::thread(f));
threads.push_back(thread);
} // Wait for all threads in the pool to exit.
for (std::size_t i = ; i < threads.size(); ++i) {
threads[i]->join();
}

改进基于Boost.Asio的聊天服务的更多相关文章

  1. boost asio 网络聊天 代码修改学习

    简化asio的聊天代码 去除ROOM的设计 所有连接客户端均在同一个ROOM下 /*********************************************************** ...

  2. boost asio 一个聊天的基本框架

    示例代码 #include "Util.h" #include "MyAsio.h" #include "TcpConnectionManager.h ...

  3. 使用boost.asio实现网络通讯

    #include <boost/asio.hpp> #define USING_SSL //是否加密 #ifdef USING_SSL #include <boost/asio/ss ...

  4. Boost Asio介绍--之一

    原文:http://www.tuicool.com/articles/YbeYR3 Boost Asio介绍--之一 时间 2014-03-26 17:57:39  CSDN博客 原文  http:/ ...

  5. Boost Asio(一)初探

    一.简介 Boost Asio ( asynchronous input and output)关注数据的异步输入输出.Boost Asio 库提供了平台无关性的异步数据处理能力(当然它也支持同步数据 ...

  6. boost asio异步读写网络聊天程序client 实例具体解释

    boost官方文档中聊天程序实例解说 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...

  7. boost asio异步读写网络聊天程序客户端 实例详解

    boost官方文档中聊天程序实例讲解 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...

  8. 01--c实现基础客户端和服务端与c++ boost.asio实现对比

    c实现服务端和客户端交互: 学习查阅的博客: https://blog.csdn.net/u011068702/article/details/54380259 https://blog.csdn.n ...

  9. boost::asio译文

        Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...

随机推荐

  1. msyql 字节问题

    MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定).在 MySQL5.0以上的版本中,varchar数据 ...

  2. php动态分页类

    <?php /** * 页面名称:cls_page.php */ class Page { private $each_disNums; //每页显示的条目数 private $nums; // ...

  3. PHP学习之[第08讲]数据库MySQL基础之增删改查

    一.工具: 1.phpMyAdmin (http://www.phpmyadmin.net/) 2.Navicat (http://www.navicat.com/) 3.MySQL GUI Tool ...

  4. [转]【基于zxing的编解码实战】精简Barcode Scanner篇

    通过<[搞定条形码]zxing项目源码解读(2.3.0版本,Android部分)>的分析,现在可以实现最终目标了:精简Barcode Scanner并将其中的编码和解码分离为两个独立的部分 ...

  5. HDOJ 5184 Brackets 卡特兰数扩展

    既求从点(0,0)仅仅能向上或者向右而且不穿越y=x到达点(a,b)有多少总走法... 有公式: C(a+b,min(a,b))-C(a+b,min(a,b)-1)  /// 折纸法证明卡特兰数: h ...

  6. 专业DBA 遇到的问题集

    http://blog.csdn.net/mchdba/article/category/1596355/3

  7. linux下显卡信息的查看

    lspci  | grep -i vga 这样就可以显示机器上的显卡信息,比如 [root@localhost conf]# lspci | grep -i vga01:00.0 VGA compat ...

  8. RHEL7下PXE+NFS+Kickstart无人值守安装操作系统

    RHEL7下PXE+NFS+Kickstart无人值守安装操作系统 1.配置yum源 vim /etc/yum.repos.d/development.repo [development] name= ...

  9. HDU 4462(暴力枚举)

    因为题目当中的k比较小k <= 10,所以可以直接枚举,题目里面由两个trick, 一个是如果每个点都可以放稻草人的话,那么答案是0, 另外一个就是如果可以放稻草人的点不用被照到.知道了这两个基 ...

  10. codevs 1378 选课 (树形DP)

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; ][],f[] ...