c语言实现线程池,c++ 线程池

  c语言实现线程池,c++ 线程池

  目录完整代码任务池. cpp

  TaskPool.cpp//

  //由联想于2021/10/25创建。

  //

  #包含" TaskPool.h "

  #包括功能

  STD:mutex打印互斥体;

  任务池:任务池():m _ bRunning(false)

  {

  }

  任务池:~任务池()

  {

  删除所有任务();

  }

  void任务池:init(int threadNum/*=5 */)

  {

  if (threadNum=0)

  线程数=5;

  m _ bRunning=true

  for(int I=0;我threadNumi ) {

  STD:shared _ ptr STD:thread sp线程;

  //这个约束含义是啥

  sp线程。reset(new STD:thread(STD:bind(task pool:thread func,this)));

  {

  STD:lock _ guard STD:mutex guard(打印互斥量);

  std:cout Init a thread,id: sp thread-get _ id()STD:endl;

  }

  m _线程。push _ back(sp线程);

  }

  }

  空的任务池*停止()

  {

  m _ bRunning=false

  //通知所有线程,不运行了

  m _ cv。notify _ all();

  //等待所有线程退出

  for (auto it : m_threads) {

  if (it- joinable())

  it-join();

  }

  }

  void TaskPool:addTask(任务*任务)

  {

  STD:shared _ ptr Task sp Task;

  sp任务。重置(任务);

  {//将工作加入队列是互斥的

  STD:lock _ guard STD:mutex guard(m _ mutexList);

  m _任务列表。push _ back(sp任务);

  }

  {

  STD:lock _ guard STD:mutex guard(打印互斥量);

   std:cout 添加一个任务,id: spTask- getID(),线程编号为: STD:this _ thread:get _ id()STD:endl;

  }

  //通知一个线程的等待子线程

  m _ cv。notify _ one();

  }

  void TaskPool:removeAllTasks()

  {

  {//需要先互斥地将指向任务列表的光电带读数机(光电磁带阅读器)重置,然后将整个任务列表资源克莱德

  STD:lock _ guard STD:mutex guard(m _ mutexList);

  for (auto it : m_taskList) {

  它。reset();

  }

  m _任务列表。clear();

  }

  }

  空的任务池* thread func()

  {

  STD:shared _ ptr Task sp Task;

  while (true) {

  //获取工作的过程是互斥的

  { //减少锁的粒度

  STD:unique _ lock STD:mutex guard(m _ mutexList);

  //如果任务队列为空,那么就一直等等,等待线程被唤醒加入到队列中

  while (m_taskList.empty()) {

  如果(!m_bRunning)

  打破;

  //如果获得了互斥锁,但是条件不满足

  //等待()会释放锁,挂起当前线程

  //条件变量发生变化的时候,等待()将环型挂起的线程并获得锁

  等一等(后卫);

  }

  如果(!m_bRunning)

  打破;

  //获取队头工作

  sp任务=m _任务列表。front();

  m _任务列表。pop _ front();

  }

  //如果队列为空,则重新进行尝试获取

  if (spTask==NULL)

  继续;

  //否则,执行工作任务

  sp task-doIt();

  //完成之后,将指针重置

  sp任务。reset();

  }

  STD:lock _ guard STD:mutex guard(打印互斥量);

   std:cout 退出线程,threadID: STD:this _ thread:get _ id()STD:endl;

  }

  TaskPool.h//

  //由联想于2021/10/25创建。

  //

  #ifndef UNTITLED_TASKPOOL_H

  #定义未命名的任务池

  #包含线程

  #包含互斥体

  #包含条件变量

  #包含列表

  #包含矢量

  #包括内存

  #包括输入输出流

  extern STD:mutex打印互斥体;

  课程任务{

  私人:

  无符号整数id;

  公共:

  任务(无符号整数ID)

  {

  id=ID

  }

  虚拟void doIt()

  {

  STD:lock _ guard STD:mutex guard(打印互斥量);

   std:cout 处理一个任务,TaskID为:“ID”,thradID为: STD:this _ thread:get _ id()STD:endl;

  }

  虚拟~任务()

  {

  STD:lock _ guard STD:mutex guard(打印互斥量);

   std:cout 一个任务被析构,TaskID为:“ID”,thradID为: STD:this _ thread:get _ id()STD:endl;

  }

  无符号整数getID()

  {

  返回id;

  }

  };

  班级任务池期末考试{

  公共:

  任务池();

  ~任务池();

  任务池(常量任务池RHS)=1删除;

  任务池操作符=(常量任务池RHS)=删除;

  公共:

  //初始化线程

  void init(int thread num=5);

  //通知所有线程结束运行,并等待所有线程运行结束

  void stop();

  void添加任务(任务*任务);

  void删除所有任务();

  私人:

  void螺纹func();

  私人:

  STD:list STD:shared _ ptr Task m _ Task list;

  STD:mutex m _ mutexList;

  STD:condition _ variable m _ cv;

  布尔布朗宁

  STD:vector STD:shared _ ptr STD:thread m _ threads;

  };

  # endif//未命名任务池

  包含秒表计时

  #包含" TaskPool.h "

  int main()

  {

  任务池线程池;

  线程池。init();

  Task * task=NULL

  for(int I=0;i 10i ) {

  任务=新任务(一);

  threadPool.addTask(任务);

  }

  STD:this _ thread:sleep _ for(STD:chrono:seconds(5));

  thread pool . stop();

  返回0;

  }

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: