一种类似JAVA线程池的C++线程池实现方法

 更新时间:2019年07月24日 10:48:01   投稿:mrr  
线程池(thread pool)是一种线程使用模式。线程过多或者频繁创建和销毁线程会带来调度开销,进而影响缓存局部性和整体性能。这篇文章主要介绍了一种类似JAVA线程池的C++线程池实现方法,需要的朋友可以参考下

什么是线程池

线程池(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++线程池实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • Security中的@PostAuthorize、@PreFilter和@PostFilter详解

    Security中的@PostAuthorize、@PreFilter和@PostFilter详解

    这篇文章主要介绍了Security中的@PostAuthorize、@PreFilter和@PostFilter详解,@PostAuthorize是在方法调用完成后进行权限检查,它不能控制方法是否能被调用,只能在方法调用完成后检查权限决定是否要抛出AccessDeniedException,需要的朋友可以参考下
    2023-11-11
  • tio-boot jfinal-plugins框架整合redis示例详解

    tio-boot jfinal-plugins框架整合redis示例详解

    这篇文章主要为大家介绍了tio-boot jfinal-plugins框架整合redis示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • java短路逻辑运算符实例用法详解

    java短路逻辑运算符实例用法详解

    在本篇文章里小编给大家分享的是一篇关于java短路逻辑运算符实例用法内容,有需要的朋友们可以学习参考下。
    2021-04-04
  • Servlet从入门到精通(超级详细!)

    Servlet从入门到精通(超级详细!)

    在JavaWeb项目中,处理请求和发送响应的过程是由一种叫做Servlet 的程序来完成的,并且 Servlet 是为了解决实现动态页面而衍生的东西,下面这篇文章主要给大家介绍了关于Servlet从入门到精通的相关资料,需要的朋友可以参考下
    2022-03-03
  • 解决idea中servlet报红问题

    解决idea中servlet报红问题

    这篇文章主要介绍了解决idea中servlet报红问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)

    MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)

    这篇文章主要介绍了MyBatis 中 ${}和 #{}的正确使用方法,本文给大家提到了MyBatis 中 ${}和 #{}的区别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java使用@Validated注解进行参数验证的方法

    Java使用@Validated注解进行参数验证的方法

    这篇文章主要介绍了Java使用@Validated注解进行参数验证的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • java中的基础运算符

    java中的基础运算符

    这篇文章主要介绍了Java基本数据类型和运算符,结合实例形式详细分析了java基本数据类型、数据类型转换、算术运算符、逻辑运算符等相关原理与操作技巧,需要的朋友可以参考下
    2021-08-08
  • 一文带你搞懂Java单例模式

    一文带你搞懂Java单例模式

    单例就是单实例的意思,即在系统全局,一个类只创建一个对象,并且在系统全局都可以访问这个对象而不用重新创建。本文将通过示例为大家详细讲解Java单例模式的使用,需要的可以参考一下
    2022-11-11
  • Springcloud Nacos基本操作代码实例

    Springcloud Nacos基本操作代码实例

    这篇文章主要介绍了Springcloud Nacos基本操作代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12

最新评论