threadpool版回射服务器
threadpool
threadpool版的回射服务器
想写threadpool,所以就拿这个练练手,超简单,不用多说什么,程序员直接看代码就OK
先说下各个文件的作用吧
myservere.cpp 服务器端主程序,用于接收connfd,并向线程池中添加任务
str_echo.cpp 服务器端回射代码写在这,很简单,直接收到就回射
condition.cpp 维护mutex和cond,对这两个参数进行封装
threadpool.cpp 线程池主程序,封装了各种对线程池的操作,并且负责调用回调函数。
my_unp.cpp 自己写的一个unp代码,里面封装了网络的初始化和常用函数
my_err.cpp 自己写的一个报错语句
myclient-easy.cpp 客户端主程序,功能:从键盘读,发送给服务器,接收,打印到屏幕
然后,说下思路吧
myserver.cpp开始,初始化网络(socket,bind,listen),然后for循环等待accept。每接到一个连接,就add一个task,把connfd作为参数。
画面转到 threadpool.cpp ,调用里面的threadpool_add_task()函数,此函数把一个task增加到poll里面,然后如果有空闲进程就唤醒空闲进程,如果没有的话就新建一个进程进行数据的处理。
接下来,无论是唤醒进程还是新建进程,都会转到执行thread_routine()函数,此函数可概括为三个功能
- 如果此线程的任务执行完毕,则wait新任务到达,超时则销毁自身
- 如果来了新任务(既poll->first != NULL),则调用task里面的回调函数,并传task->args过去
- 如果收到了线程池的销毁命令(quit),则对本线程自毁,如果线程池无线程则通吃线程池。
接下来转到回调函数,回调函数在myserver.cpp中,叫doit(),此函数负责调用str_echo()。
str_echo()函数则是正常的回射服务代码。
程序依赖图
下面是各个文件的依赖关系,图画的有点水,见谅
结构可能规划的不对,欢迎大佬来指导。
其他的代码里面会有注释。完整代码可以看我的github
https://github.com/xixihahag/threadpool
Ps.默认线程池最大值是3,可以在threadoiil_init函数的第二个参数那里改。