流程
- 创建套接字至监听:s
- 线程池初始化:pool
- while循环
[1] accept接受连接:c
[2] 创建新任务,参数c:task
[3] 加入到任务队列:pool.append_task(task)
任务:task
客户端套接字:c
echo函数:循环接收客户端消息并回射
锁:mutex
条件变量:myCond
- 介绍:基于condition_variable实现
- 函数:
[1] 等待条件:调用wait
[2] 通知等待条件的线程:调用notify_one
[3] 通知所有线程:调用notify_all
线程池:thread_pool
-
介绍:
线程池空闲时,进行线程回收
线程池忙碌时,进行额外线程申请新任务到来,push到任务队列,若进队之前任务为空,通知处于等待状态的线程
任务处理:取任务队列首项,空则等待新任务,否则执行
取任务:任务队列非空取首项
结束时通知所有线程 -
函数
[1] 构造函数:new线程组,作为线程池
[2] 析构函数:delete线程组,通知所有线程,线程池结束,即条件bool is_stop置true并调用notify_all
[3] 初始化:线程与处理函数绑定,detach分离
[4] 处理函数:调用run
[5] run:while 线程池未结束,取任务队列首项,空则等待,非空执行echo(即服务器线程与客户端进行while通信)
[6] 任务入队:上锁,入队,解锁,入队前队空则通知等待任务的线程
[7] 取任务队列首项:上锁,队非空取队首,解锁 -
分析:需要加锁的操作,入队分先后,防止顺序错乱;出队且取值,防止取错,需加锁
线程池模型
- 任务:服务器线程,与客户端连接,echo回射
- 任务队列:取队首,出队首,入队尾
- 线程池:初始化,新任务到来给他一个线程,线程完成一个任务继续找下一个任务,终止
- 线程同步:mutex+condition_variable
My code:
https://download.csdn.net/download/qq_31854267/10775721