一种类似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++线程池实现方法,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!


猜你喜欢
- 代码如下所示: public static Bitmap
- 本文实例为大家分享了java开发利用jacob将word转pdf的具体代码,供大家参考,具体内容如下jacob 缺点:需要 window 环
- 这里合并用到了一个itext的包。使用maven直接导入依赖即可。<dependency> <g
- 存储过程:CREATE PROCEDURE [dbo].[Proc_GetInfo] @yw
- 本文实例讲述了C++判断一个链表是否为回文结构的方法。分享给大家供大家参考,具体如下:题目:给定一个链表头节点head,请判断是否为回文结构
- 在分支较多的时候,switch的效率比if高,在反汇编中我们即可看到效率高的原因一、switch语句1、在正向编码时,switch语句可以看
- 本文实例讲述了Android开发之获取LayoutInflater对象的方法。分享给大家供大家参考,具体如下:在写Android程序时,有时
- 工厂方法模式定义: Define an interface for creating an object, but let subclass
- 本文实例讲述了.net的序列化与反序列化的实现方法。分享给大家供大家参考。具体方法如下:1.序列化与反序列化概述C#中如果需要:将一个结构很
- 背景:当我们有需求将HashMap转为Json格式的String时,切记不要使用HashMap的toString()方法,需要使用FastJ
- 1. 前言Spring的核心技术IOC(Intorol of Converse控制反转)的实现途径是DI(dependency Insert
- Word中设置水印时,可加载图片设置为水印效果,但通常添加水印效果时,会对所有页面都设置成统一效果,如果需要对每一页或者某个页面设置不同的水
- 简介:本文将帮助您使用 Spring Boot 创建简单的 REST 服务。你将学习什么是 REST 服务?如何使用 Spring Init
- 前言回想一下,在学Java时接触的正则表达式,其实Kotlin中也是类似。只不过使用Kotlin 的语法来表达,更为简洁。正则(Regex)
- 问题描述如果直接获取某个json数组中的元素将得到如下的json{ "44": { "height
- 之前写轮播条或者指示器的时候都是UI图里面直接有,这样的效果并不好,给用户的体验比较差,所以闲暇之余自己写了个指示器,可以展现出一个优雅的效
- 在程序开发中通常有推送消息的需求,通常为短信服务,邮件,电话提醒。短信及电话提醒通常需要向运营商购买服务调用接口,比较麻烦。邮件信息推送也是
- Maven Repository仓库的具体使用不知道大家是不是这样,反正我访问官网的时候不是非常慢就是崩溃,所以我就将我用过的Maven依赖
- Android 消息机制1.概述Android应用启动时,会默认有一个主线程(UI线程),在这个线程中会关联一个消息队列(MessageQu
- 本文实例为大家分享了利用多线程和Socket实现猜拳游戏的具体代码,供大家参考,具体内容如下实例:猜拳游戏猜拳游戏是指小时候玩的石头、剪刀、