Linux并发服务器之线程池(thread实现)

流程

  1. 创建套接字至监听:s
  2. 线程池初始化:pool
  3. while循环
    [1] accept接受连接:c
    [2] 创建新任务,参数c:task
    [3] 加入到任务队列:pool.append_task(task)

任务:task

客户端套接字:c
echo函数:循环接收客户端消息并回射


锁:mutex

条件变量:myCond

  1. 介绍:基于condition_variable实现
  2. 函数:
    [1] 等待条件:调用wait
    [2] 通知等待条件的线程:调用notify_one
    [3] 通知所有线程:调用notify_all

线程池:thread_pool

  1. 介绍:
    线程池空闲时,进行线程回收
    线程池忙碌时,进行额外线程申请

    新任务到来,push到任务队列,若进队之前任务为空,通知处于等待状态的线程
    任务处理:取任务队列首项,空则等待新任务,否则执行
    取任务:任务队列非空取首项
    结束时通知所有线程

  2. 函数
    [1] 构造函数:new线程组,作为线程池
    [2] 析构函数:delete线程组,通知所有线程,线程池结束,即条件bool is_stop置true并调用notify_all
    [3] 初始化:线程与处理函数绑定,detach分离
    [4] 处理函数:调用run
    [5] run:while 线程池未结束,取任务队列首项,空则等待,非空执行echo(即服务器线程与客户端进行while通信)
    [6] 任务入队:上锁,入队,解锁,入队前队空则通知等待任务的线程
    [7] 取任务队列首项:上锁,队非空取队首,解锁

  3. 分析:需要加锁的操作,入队分先后,防止顺序错乱;出队且取值,防止取错,需加锁

线程池模型

  1. 任务:服务器线程,与客户端连接,echo回射
  2. 任务队列:取队首,出队首,入队尾
  3. 线程池:初始化,新任务到来给他一个线程,线程完成一个任务继续找下一个任务,终止
  4. 线程同步:mutex+condition_variable

My code:

https://download.csdn.net/download/qq_31854267/10775721

你可能感兴趣的:(网络编程)