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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。