c++并发服务器Linux

原理叙述

并发服务器从框架结构上分为以下四个步骤:

  • 建立TCP socket服务器
  • 编译一个解析HTTP request的解析器
  • 后续处理
  • 产生response

并发服务器要求高并发,在linux环境下可用epoll多路IO服用机制,程序内部使用线程池,若需使用队列或者hash表等容器,可使用intel的tbb开源c++计算库

  • epoll多路复用机制较select与poll相比,没有并发连接数量的限制,并且呢效率提升,而不是select的无差别轮询,在内存拷贝方面,利用mmap函数避免了内存与内核数据复制
  • 线程池实现多个线程并行处理,也可以直接用多线程thread实现
  • 在多线程环境中,公共存储需要加锁,不然会造成资源冲突,但是加锁较耗费时间,用的最多的锁有互斥锁、读写锁、自旋锁,tbb的c++并行计算库实现了无锁队列以及hash表。

大致流程图

在这里插入图片描述

关键代码实现

int startServer(int port) {
    HttpServer http_server;
    //http_server.set_thread_pool(&tp);
	init_facetable(faceTable);
	cout<<"face table size startServer: "<<faceTable.size()<<endl;
	http_server.add_mapping("/api/face/login", login, GET_METHOD | POST_METHOD);
	http_server.add_mapping("/api/face/add", faceAdd, GET_METHOD | POST_METHOD);
	http_server.add_mapping("/api/face/identify", faceIdentify, GET_METHOD | POST_METHOD);
	http_server.add_mapping("/api/face/setName", faceSetName, GET_METHOD | POST_METHOD);
	http_server.add_mapping("/api/face/list", faceList, GET_METHOD | POST_METHOD);
	http_server.add_mapping("/api/face/remove", faceRemove, GET_METHOD | POST_METHOD);
	http_server.add_mapping("/api/face/query", query, GET_METHOD | POST_METHOD);
	//http_server.add_mapping("/api/download/face_image", faceimageDownload, GET_METHOD | POST_METHOD);
   // http_server.add_bind_ip("127.0.0.1");
    http_server.set_port(port);
    http_server.set_backlog(10000);
    http_server.set_max_events(10000);
    //http_server.add_bind_ip("192.168.238.158");
    http_server.start_async();
    //sleep(1);
    //http_server.stop();
    http_server.join();
    http_server.stop();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值