JAVA线程池的C++线程池该怎么实现
创始人
2024-12-22 05:43:17
0次

什么是线程池

线程池(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 #include 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_demoMix Thread BeginThread 3: loop index 0Thread 4: loop index 0Thread 2: loop index 0Thread 1: loop index 0Thread 0: loop index 0Thread 4: loop index 1Thread 3: loop index 1Thread 2: loop index 1Thread 1: loop index 1Thread 0: loop index 1Thread 4: loop index 2Thread 3: loop index 2Thread 2: loop index 2Thread 1: loop index 2Thread 0: loop index 2Mix Thread End

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...