• Linux操作系统-线程池


    谈线程池之前先讲一讲池化技术

    池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。

    常见的池化技术:线程池、进程池、内存池。

    池化技术的优点

    不同池化技术的应用场景不同,但都有一些共同的特点

    1、资源的重复利用

    2、降低系统的开销

    例如,线程池预先创建一批线程,在IO密集型的场景下,线程池可以有效的降低频繁的创建线程释放线程的开销。内存池预先向系统申请一大块内存,通过自行设计方法管理内存,可以有效的减少内存碎片的问题。

    池化技术简单点来说,就是提前保存大量的资源,以备不时之需。池化技术有两个特点,提前创建和重复利用。

    线程池

    预先创建一批线程,提高处理业务的效率。

    通过指派任务的方式,不用从零开始创建,直接把某个任务指派到某个线程。

    线程池通过一个线程安全的阻塞任务队列加上一个或一个以上的线程实现,线程池中的线程可以从阻塞队列中获取任务进行任务处理,当线程都处于繁忙状态时可以将任务加入阻塞队列中,等到其它的线程空闲后进行处理。

    解决的问题

    1、节省创建系统的时间成本的问题

    2、防止系统大量请求的冲击,将大量请求塞到任务队列里,这样不用创建过多执行流导致系统震荡的问题例如网络服务器请求。

    模拟实现

    所需的参数:互斥量pthread_mutex_t,条件变量pthread_cond_wait,和任务队列queue。

    1. #include <iostream>
    2. #include <pthread.h>
    3. #include <queue>
    4. class Task{
    5. private:
    6. int num;
    7. public:
    8. Task(int _num)
    9. :num(_num)
    10. {}
    11. void run()
    12. {
    13. std::cout<<"thread id is "<<pthread_self()<<",Get num is "<<num<<std::endl;
    14. }
    15. };
    16. class ThreadPool
    17. {
    18. private:
    19. pthread_mutex_t mtx;//互斥量
    20. pthread_cond_t cond;//条件变量
    21. std::queue<Task*> qt;//任务队列
    22. int thread_num;//线程池中线程的数量
    23. public:
    24. ThreadPool(int _thread_num)
    25. :thread_num(_thread_num)
    26. {}
    27. void ThreadPoolInit()
    28. {
    29. //初始化线程池
    30. pthread_mutex_init(&mtx,nullptr);
    31. pthread_cond_init(&cond,nullptr);
    32. //预先创建一批线程
    33. pthread_t tid[thread_num];
    34. for(int i=0;i < thread_num;i++)
    35. {
    36. pthread_create(tid+i,nullptr,routine,this);//将this指针作为参数传入入口函数
    37. }
    38. }
    39. void PushTask(Task* t)
    40. {
    41. Lock();//加锁
    42. qt.push(t);
    43. UnLock();
    44. WakeUp();//一旦有任务,就唤醒线程
    45. }
    46. private:
    47. //线程的入口函数
    48. static void* routine(void* arg)
    49. {
    50. ThreadPool* tp = (ThreadPool*)arg;
    51. while(true)
    52. {
    53. tp->Lock();//加锁
    54. while(tp->qt.empty())//while判断条件是否满足,防止虚唤醒
    55. {
    56. tp->Wait();
    57. }
    58. Task* t = tp->qt.front();
    59. tp->qt.pop();
    60. tp->UnLock();
    61. t->run();
    62. }
    63. return nullptr;
    64. }
    65. //封装一些函数
    66. void Lock()
    67. {
    68. pthread_mutex_lock(&mtx);
    69. }
    70. void UnLock()
    71. {
    72. pthread_mutex_unlock(&mtx);
    73. }
    74. void Wait()
    75. {
    76. pthread_cond_wait(&cond,&mtx);
    77. }
    78. void WakeUp()
    79. {
    80. pthread_cond_signal(&cond);
    81. }
    82. };

     

  • 相关阅读:
    基于下垂控制的孤岛双机并联逆变器环流抑制模型(Simulink仿真实现)
    SSM+图书馆电子文件资源管理 毕业设计-附源码191614
    python习题004--使用python实现ATM机效果
    python基础专栏12-python基础篇-复合数据类型-字典
    安全架构中的前端安全防护研究
    单调队列优化的DP——最大子序和
    以太坊 layer2: optimism 源码学习 (一)
    一个vuepress配置问题,引发的js递归算法思考
    嵌入式开发,如何防止设备被抄袭?
    Rust中Option、Result的map和and_then的区别
  • 原文地址:https://blog.csdn.net/weixin_43164548/article/details/125499103