改进基于Boost.Asio的聊天服务
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的聊天服务的更多相关文章
- boost asio 网络聊天 代码修改学习
简化asio的聊天代码 去除ROOM的设计 所有连接客户端均在同一个ROOM下 /*********************************************************** ...
- boost asio 一个聊天的基本框架
示例代码 #include "Util.h" #include "MyAsio.h" #include "TcpConnectionManager.h ...
- 使用boost.asio实现网络通讯
#include <boost/asio.hpp> #define USING_SSL //是否加密 #ifdef USING_SSL #include <boost/asio/ss ...
- Boost Asio介绍--之一
原文:http://www.tuicool.com/articles/YbeYR3 Boost Asio介绍--之一 时间 2014-03-26 17:57:39 CSDN博客 原文 http:/ ...
- Boost Asio(一)初探
一.简介 Boost Asio ( asynchronous input and output)关注数据的异步输入输出.Boost Asio 库提供了平台无关性的异步数据处理能力(当然它也支持同步数据 ...
- boost asio异步读写网络聊天程序client 实例具体解释
boost官方文档中聊天程序实例解说 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...
- boost asio异步读写网络聊天程序客户端 实例详解
boost官方文档中聊天程序实例讲解 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...
- 01--c实现基础客户端和服务端与c++ boost.asio实现对比
c实现服务端和客户端交互: 学习查阅的博客: https://blog.csdn.net/u011068702/article/details/54380259 https://blog.csdn.n ...
- boost::asio译文
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...
随机推荐
- python中如何判断list中是否包含某个元素
在python中可以通过in和not in关键字来判读一个list中是否包含一个元素 pythontab = ['p','y','t','h','o','n','t','a','b'] if 't' ...
- SCOI2013 多项式的运算
---恢复内容开始--- 又是一道裸数据结构题. 之前受序列操作的蛋疼写法影响,只用一个tag,不知道怎么记,之后看了下别人的,终于领悟要用两个tag,一个add,一个mul,维护相当简单,想清楚就行 ...
- 用于A*的 二叉堆 AS3实现
package com.copper.isometric.pathing { import flash.sampler.startSampling; /** * ...
- "Storage Virtualization" VS "Software-Defined Storage"
http://www.computerweekly.com/blogs/StorageBuzz/2013/07/storage-virtualisation-vs-soft.html 这篇blog的目 ...
- [AWS] Install the AWS cli
On Windows, just download the installer and install it. Configure: aws configure In your aws console ...
- 解决Xcode6.0.1编译Unity3Dproject报错
错误信息大概例如以下 Undefined symbols for architecture i386: "_clock$UNIX2003",.....等 大概就是引用了一个链接库出 ...
- Win7下Qt5.2中使用OpenGL的glu函数库无法使用的解决方案
最近在Window7使用Qt5.2学习OpenGL时,出现了以OpenGL中glu开头的函数库无法使用的错误,例如: 'gluPerspective' was not declared ...
- staticMetaObject
staticMetaObject : QObject 及其 子类 的静态属性成员. 定义如下: const QMetaObject staticMetaObject; QMetaObject 记录了 ...
- 通过扩展RandomAccessFile类使之具备Buffer改善I/O性能--转载
主体: 目前最流行的J2SDK版本是1.3系列.使用该版本的开发人员需文件随机存取,就得使用RandomAccessFile类.其I/O性能较之其它常用开发语言的同类性能差距甚远,严重影响程序的运行效 ...
- Linux FTP YUM源搭建简单记录
1. 挂载iso镜像,进入Packages目录下安装FTP服务 #rpm -ivh vsftpd-3.0.2-10.el7.x86_64.rpm 2. 修改vsftpd配置文件如下 [root@rus ...