测试了一下boost的异步io.
客户端::向服务器发出多个请求,连接成功就打印一条消息。
服务器端:主线程调用async_accept,handler函数先调用一个async_accept以接收新的请求。然后就去干自己的事了(sleep几秒)
服务器:
#include<iostream>
#include<boost/asio.hpp>
#include<boost/thread.hpp>
using namespace std;
using namespace boost;
using namespace boost::asio;
io_service io_s;
ip::tcp::acceptor acc(io_s,ip::tcp::endpoint(ip::tcp::v4(),1234));
int i=0;
void th(int n){
this_thread::sleep(posix_time::seconds(3));
cout << "this is " << n << endl; //全局操作需要同步
}
void handler(system::error_code e);
void start_accept(){
ip::tcp::socket sock(io_s);
acc.async_accept(sock,handler);
}
void handler(boost::system::error_code e){
start_accept();
cout << "accept sucess\n"; //异步处理函数,单线程调用io.run(),不会导致同步问题
//this_thread::sleep(posix_time::seconds(3)); //加上这句全导致其它的handler阻塞
thread t(boost::bind(th,i++));
cout << "handle sucess\n";
}
int main()
{
start_accept();
io_s.run();
}
客户:
#include<iostream>
#include<boost/asio.hpp>
#include<boost/thread.hpp>
using namespace std;
using namespace boost;
using namespace boost::asio;
int main()
{
io_service io_s;
for (int i = 0; i != 100; ++i){
ip::tcp::socket sock(io_s);
ip::tcp::endpoint endp(ip::address::from_string("192.168.1.107"), 1234);
sock.connect(endp);
cout << "sucess\n";
}
}
观察输出结果发现和tcpdump发现:服务器能速度处理掉100个连接申请
结论:
单线程中调用io.run()时,异步处理函数handler是线程安全的,不用上锁就能处理全部变量,反过来说就是一次只能运行一个handler,某个handler阻塞就会阻塞其它handler,使用的时候要考虑。