C++怎么实现一个简单的线程池
发表于:2024-11-19 作者:千家信息网编辑
千家信息网最后更新 2024年11月19日,本文小编为大家详细介绍"C++怎么实现一个简单的线程池",内容详细,步骤清晰,细节处理妥当,希望这篇"C++怎么实现一个简单的线程池"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知
千家信息网最后更新 2024年11月19日C++怎么实现一个简单的线程池
本文小编为大家详细介绍"C++怎么实现一个简单的线程池",内容详细,步骤清晰,细节处理妥当,希望这篇"C++怎么实现一个简单的线程池"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
一、设计
线程池应该包括
保存线程的容器,保存任务的容器。
为了能保证避免线程对任务的竞态获取,需要对任务队列进行加锁。
为了使得工作线程感知任务的到来,需要使用条件变量来唤醒工作线程。
任务容器中的任务管理。
任务的处理API。
二、参数选择
使用数组存放线程,链表存放任务。
三、类设计
线程池类
templateclass threadpool{public: threadpool(int thread_num,int max_request); ~threadpool(); bool append(T* request); // 在任务队列中添加任务private: static void worker(void* arg); void run();private: int m_thread_num; // 线程池中的线程数 int m_max_request; // 任务队列最大保存的任务数 pthread_t *m_threads; // 保存线程的容器 std::list m_queuework; // 保存任务的链表 sem m_sem; // 通知工作线程任务到来 lock m_locker; // 互斥访问任务队列};
构造函数
templatethreadpool ::threadpool(int thread_num,int max_request):m_thread_num(thread_num),m_max_request(max_request){ if(thread_num <=0 || max_request <= 0) throw std::exception(); m_threads = new pthread_t[thread_num]; if(!m_threads) throw std::exception(); for(int i = 0;i < thread_num;++i) { // 创建线程 if(pthread_create(m_threads + i, NULL,worker,this)!=0) { delete[] m_threads; throw std::exception(); } // 分离线程 if(pthread_detach(m_threads[i])) { delete[] m_threads; throw std::exception(); } }}
析构函数
templatethreadpool ::~threadpool(){ delete[] m_trheads;}
添加任务函数
templatebool threadpool ::append(T* request){ m_locker.lock(); if(m_queuework.size() > m_max_request) { m_locker.unlock(); return false; } m_queuework.push_back(request); m_locker.unlock(); m_sem.post(); return true;}
任务处理函数
templatevoid* threadpool ::worker(void*arg){ threadpool* pool = (threadpool*)arg; pool->run(); return pool;}template void threadpool ::run(){ while(true) { m_sem.wait(); m_locker.lock(); if(m_queuework.empty()) { m_locker.unlock(); continue; } T* request = m_queuework.front(); m_queuework.pop_front(); m_locker.unlock(); request.process(); // 具体任务的处理业务 }}
读到这里,这篇"C++怎么实现一个简单的线程池"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
任务
线程
函数
容器
队列
处理
C++
文章
工作
内容
设计
妥当
最大
业务
参数
变量
思路
数组
新知
更多
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络技术有哪些方面的技术
管理中心服务器的是什么子系统
软件开发标准 gb
数据库设计中编码是什么
同江市网络安全和信息化
软件开发收入如何纳税
服务器电源与pc电源区别
青岛 数据库代理商
幻塔总掉线连接服务器失败
一季度处置网络安全威胁
网络安全有几类
服务器内存卡槽先插白色的
政府网络安全检查制度
宁夏软件开发哪里靠谱
网络安全基本属于
宁波软件开发驻场费用是多少
互联网金融跟金融科技监管机制
靠谱的财务软件开发方案
江阴埃抗软件开发公司
关于网络安全宣传画
无锡智能软件开发简介
软件开发发展分析
服务器怎么挂软件
cc2640软件开发指南
服务器安全组规则查看
安徽动能服务器厂家虚拟主机
南阳理工软件类软件开发
服务器远程管理ip配置
软件开发集成显卡和独立显卡
阿里云香港服务器价格表