一种类似JAVA线程池的C++线程池实现方法
作者:mrr 发布时间:2021-11-02 21:31:52
什么是线程池
线程池(thread pool)是一种线程使用模式。线程过多或者频繁创建和销毁线程会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着管理器分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价,以及保证了线程的可复用性。线程池不仅能够保证内核的充分利用,还能防止过分调度。
线程池的实现
线程池在JAVA平台上已经有成熟的实现方式,本文介绍参考JAVA线程池实现方式实现的C++线程池类库。
该类库代码已上传至github仓库中,下载地址为:https://github.com/xiaoba-8/mixthread
该类库中主要的类的关系如下图所示:
线程池类图
其中,IRuanble为接口类,类似JAVA中的Runnable接口;
DefulatMutext 为访问互斥体类,用于临界资源时的加解锁;
RootThread为线程实现的基类,定义了线程中的通用的方法;
CommonThread为一个简单的线程实现类,类似于JAVA中的Thread类;
DefaultThread类为另一线程实现类,以IRunnable为参数,可将IRunnable转化为线程;
ThreadPool为线程池实现类,类似JAVA中的ThreadPool类。
类库的安装方法
1. 下载类库实现源代码:https://github.com/xiaoba-8/mixthread
2. 进入类库根文件夹依次执行configure,make, make install
类库的使用方法
与JAVA线程池的使用方式相似,首先创建实现IRunnable接口的类,然后交由ThreadPool类实例进行调度即可以。
以下按示例代码:
1. 创建demo_main.cpp文件,代码如下:
#include <stdio.h>
#include <mix/thread/ThreadPool.h>
class DemoThread : public mix::IRunnable
{
private:
int id;
public:
DemoThread(int id)
{
this->id = id;
}
virtual void Run()
{
for (int i = 0; i < 3; i++)
{
usleep(500);
printf("Thread %d: loop index %d\n", id, i);
}
}
virtual bool IsDelete ()
{
return true;
}
virtual int Priority()
{
return 0;
}
virtual void SetPriority(int priority)
{
}
virtual void Cancel()
{
}
virtual bool IsCanceled()
{
return false;
}
virtual void Pause() {}
virtual void Resume() {}
virtual bool IsPaused()
{
return false;
}
virtual std::string GetTaskId()
{
return "";
}
virtual void TryPause()
{
}
};
int main(int argc, char *argv[])
{
mix::ThreadPool threadPool(10, 20, 5);
printf("Mix Thread Begin\n");
for (int i = 0; i < 5; i++)
{
threadPool.Execute(new DemoThread(i));
}
sleep(1);
while (threadPool.GetActiveCount() > 0)
{
sleep(1);
}
printf("Mix Thread End\n");
return 0;
}
2. 执行以下命令进行编译,(假设mixthread安装在/usr/local目录下)
g++ -I/usr/local/include -g -O2 demo_main.cpp -pthread -o mix_thread_demo -lmixthread -pthread -Wl,-rpath -Wl,/usr/local/lib
生成执行程序mix_thread_demo
3. 执行结果
执行 ./mix_thread_demo, 显示如下结果
./mix_thread_demo
Mix Thread Begin
Thread 3: loop index 0
Thread 4: loop index 0
Thread 2: loop index 0
Thread 1: loop index 0
Thread 0: loop index 0
Thread 4: loop index 1
Thread 3: loop index 1
Thread 2: loop index 1
Thread 1: loop index 1
Thread 0: loop index 1
Thread 4: loop index 2
Thread 3: loop index 2
Thread 2: loop index 2
Thread 1: loop index 2
Thread 0: loop index 2
Mix Thread End
总结
以上所述是小编给大家介绍的一种类似JAVA线程池的C++线程池实现方法,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
猜你喜欢
- 一个简单的实现版本,没有去Hook键鼠等操作,事先录制好操作步骤(将鼠标移动到需要操作的位置,按下热键执行相应动作),点击运行即可。主要还是
- 问题描述在开发批量删除功能时,往往都是多条数据,所以前台需要传一个数组给后台,但是怎么在URL中绑定一个数组,同时在后台用@PathVari
- 前言上一篇我们介绍了使用 sqflite 这个数据库工具在 Flutter 的应用中建立本地数据库的实例应用。了解过数据库的同学应该会知道,
- 前言自从用了SpringBoot,个人最喜欢的就是SpringBoot的配置文件了,和Spring比起SpringBoot更加灵活,修改的某
- 通过下面一张图看下要实现的功能,具体详情如下所示:现在我就来介绍些软件的其它功能。希望大家有所受益。模拟人为搜索商品在刷单的时候,不能直接拿
- 在一个项目中,如果我们既用到了Struts2又用到了Servlet,项目运行时有可能无法正常访问Servlet,原因是在配置Struts的过
- Stream流常见的中间操作方法Streamfilter(Predicate predicate):用于对流中的数据进行过滤predicat
- 本文首先将会回顾Spring 5之前的SpringMVC异常处理机制,然后主要讲解Spring Boot 2 Webflux的全局异常处理机
- Java接口回调产生接口回调的场景在现实生活中,产生接口回调的场景很简单,比如我主动叫你帮我做一件事,然后你做完这件事之后会通知我,&quo
- private void btnCreate_Click(object sender, EventArgs e) ...{ int hWnd
- 本文实例为大家分享了Java打印指定年月日历的具体代码,供大家参考,具体内容如下日历如下:程序如下://打印指定年月的日历public cl
- 一、No serializer found for class org.hibernate.proxy.pojo.bytebuddy.Byt
- Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-many、many-to-one、one-to-one。而是
- 图形验证码属于老生常谈了,具体细节这里就不说了。生成图形验证码的办法非常多,今天讲解一种通过Kaptcha组件快速生成图形验证码的方法。Ka
- 最近在开发的过程当中,对于已有的代码,想将相关类绘制成UML类图,虽然现在有很多UML类图的优秀软件,比如ProcessOn(可视化编辑)、
- 前言;Apache common-pool对象池介绍:对象生命周期、Config详解、代码说明对象生命周期Config详解maxActive
- Solr我还是个菜鸟,写这一些文章只是记录一下最近一段时间学习Solr的心得。 Solr是什么? 最近我学Solr的时候,一直看到一句话,S
- 一.搭建1.前端npm installnpm run serve2.后端老生常谈的配置,修改mysql与redis即可。二.业务功能介绍功能
- 一、Lambda 表达式的基础语 * ambda 表达式的基础语法:Java8中引入了一个新的操作符 "->" 该操
- 熔断与降级为什么在RPC环节中有熔断以及降级的需求,详细的原因这里不多解释,从网上搜索一张图做示意。熔断我理解熔段主要解决如下几个问题:当所