并发是什么?企业在进行产品开发过程当中为何须要考虑这个问题?想象一下天猫的双11和京东的618活动,一秒的点击量就有几十万甚至上百万,这么多请求一会儿涌入到服务器,服务器须要对这么多的请求逐个进行消化掉,假如服务器一秒的处理能力就几万,那么剩下的不能及时获得处理的这些请求做何处理?总不能让用户界面一直等着,所以消息队列应运而生,全部的请求都统一放入消息队列,工做线程从消息队列不断的消费,消息队列至关于一个缓冲区,可达到解藕、异步和削峰的目的。html
Kafka、ActiveMQ、RabbitMQ和RockerMQ都是消息队列的典型,每一种都有其自身的优点和劣势。本文我用本身编写的Buffer类模拟消息队列,若是是企业级须要上线的应用,通常都是基于业界已有的MQ框架上开发。git
1.UML静态类图:github
2.UML动态时序图:编程
1.如图,开了三个Client,运行结果正确:bash
2.Server端经过Log4cpp把日志写到文件中:服务器
https://github.com/icoty/cs_threadpool_epoll_mq网络
. ├── client // 客户端Demo │ ├── Client.cc │ ├── Client.exe │ ├── client.sh // 进入该目录下启动Client Demo: sh client.sh │ ├── Log4func.cc // 引入日志模块从新疯转 │ ├── Log4func.h │ └── Makefile // 编译方式:make ├── conf │ └── my.conf // IP,Port配置文件, 从这里进行修改 ├── include // 头文件 │ ├── Configuration.hpp // 配置文件,单例类,my.conf的内存化 │ ├── FileName.hpp // 全局定义,Configuration会用到 │ ├── log // 日志模块头文件 │ │ └── Log4func.hpp │ ├── net // 网络框架模块头文件 │ │ ├── EpollPoller.hpp │ │ ├── InetAddress.hpp │ │ ├── Socket.hpp │ │ ├── SockIO.hpp │ │ ├── TcpConnection.hpp │ │ └── TcpServer.hpp │ ├── String2Upper.hpp // 工做线程转换成大写实际走的这里面的接口 │ ├── String2UpperServer.hpp // Server端的整个工厂 │ └── threadpool // 线程池、锁、条件变量和消息队列的封装 │ ├── Buffer.hpp │ ├── Condition.hpp │ ├── MutexLock.hpp │ ├── Noncopyable.hpp │ ├── Pthread.hpp │ ├── Task.hpp │ └── Threadpool.hpp ├── log // Server端的日志经过Log4cpp记录到这个文件中 │ └── log4test.log ├── Makefile // 编译方式:make ├── README.md ├── server // server端Demo │ ├── server.exe │ └── server.sh // 进入该目录下启动Server Demo:sh server.sh └── src // 源文件 ├── Configuration.cpp ├── log │ └── Log4func.cpp ├── main.cpp ├── net │ ├── EpollPoller.cpp │ ├── InetAddress.cpp │ ├── Socket.cpp │ ├── SockIO.cpp │ ├── TcpConnection.cpp │ └── TcpServer.cpp ├── String2Upper.cpp ├── String2UpperServer.cpp └── threadpool ├── Buffer.cpp ├── Condition.cpp ├── MutexLock.cpp // MutexLockGuard封装 ├── Pthread.cpp └── Threadpool.cpp
[1] UNIX环境高级编程第3版
[2] cpp reference
[3] UML时序图
[4] Log4cpp官网下载
[5] Log4cpp安装架构