• Linux: C实现动态线程池。


    一:线程池简介

    1:什么是线程池

    所谓的池概念:都是事先创建好一些事物的集合,在需要使用时,直接调用即可。而不是在需要时才去创建。这里所讲的线程池,其实就是若干个线程的集合,形成的线程池。

    2:线程池结构体详解

    在该线程池代码中,总共有三种线程,和一个任务池。

    任务池:该类的结构体数组

    主线程:负责往任务池中添加任务

    工作线程:负责从任务池中取任务执行。

    管理者线程:比较当前任务个数与工作线程个数差值,根据差值的大小来调整对工作线程个数。(当然会保留最小线程个数)

    二:线程池创建过程

    2.1:主线程

    1:初始化线程池

    这一块主要负责对线程的各种变量进行初始化,这里要注意:子线程的创建一定要在最后,因为在实现线程同步的时候,使用了一些互斥锁和条件变量,如果不先将这些变量初始化完成,当有一个线程被主线程创建出来后,主线程和该子线程的执行顺序是随机的,那么如果该子线程比主线程先执行,贸然使用未初始化的互斥锁和条件变量,可能会造成后续无法解锁,或无法解除条件变量阻塞的状态。(博主之前就犯过这种错误!!!)

    2:添加任务进线程池

    2.2:工作线程 

    工作流程:

    1;加锁

    2:判断任务个数,和线程退出标识,若任务个数为0,阻塞条件变量,等待主线程添加任务解除阻塞,阻塞在此处的线程就是空闲线程(空闲线程太多,会有管理者线程调节线程个数)。

    3:判断线程退出标识,为真线程自动退出。

    4:判断任务个数,有任务则拿出任务并执行,拿出任务时通知主线程生产。

    5:解锁.

    6:执行任务时,将忙碌线程个数加一,当忙碌线程个数远小于总线程个数时,管理者线程会通知一部分线程退出。

    2.3:管理者线程

    比较存活线程个数与任务池的任务个数。任务数量大于线程数量,需要添加线程

    任务数量小于线程数量,需要减少线程,当然有先前设定好的最小(最大)线程个数,保证了线程不会无限制减少和增加。

    最后附上完整代码路径

    server_client: 网络编程第一天

  • 相关阅读:
    Postgresql 基于时间点恢复
    GBase 8c V3.0.0数据类型——文本检索函数
    python实现基于决策树的AdaBoost集成学习器
    Pjax 下动态加载插件方案
    Flink1.15源码解析--启动JobManager----WebMonitorEndpoint启动
    2022年9月电子学会考级试卷真题解析(含答案和所有文档下载)
    Espresso Test 4: Intent
    计算机算法分析与设计(20)---回溯法(0-1背包问题)
    智能马达地球仪芯片-DLT8P64SC-杰力科创
    三个经典示例解释什么是「零知识证明」
  • 原文地址:https://blog.csdn.net/qq_51004011/article/details/127462177