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

作者:mrr 时间:2021-11-02 21:31:52 

什么是线程池

线程池(thread pool)是一种线程使用模式。线程过多或者频繁创建和销毁线程会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着管理器分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价,以及保证了线程的可复用性。线程池不仅能够保证内核的充分利用,还能防止过分调度。

线程池的实现

       线程池在JAVA平台上已经有成熟的实现方式,本文介绍参考JAVA线程池实现方式实现的C++线程池类库。

       该类库代码已上传至github仓库中,下载地址为:https://github.com/xiaoba-8/mixthread

       该类库中主要的类的关系如下图所示:

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

线程池类图

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

标签:java,线程池,C++
0
投稿

猜你喜欢

  • Java之如何关闭流

    2023-11-04 21:29:11
  • java编程之基于SpringBoot框架实现扫码登录

    2023-02-14 02:39:28
  • 一篇文章带你入门Java Script

    2023-09-12 06:09:24
  • Java实现分页查询功能

    2023-03-03 14:30:19
  • SpringMVC深入讲解文件的上传下载实现

    2022-04-21 09:01:51
  • Spring Boot实现分布式系统中的服务发现和注册(最新推荐)

    2022-07-10 03:50:23
  • Java Selenium实现多窗口切换的示例代码

    2022-01-22 22:48:08
  • java jdk1.8 使用stream流进行list 分组归类操作

    2022-10-16 10:03:52
  • C#利用递归算法解决汉诺塔问题

    2022-04-29 23:04:10
  • java.net.SocketException: Connection reset 解决方法

    2023-06-17 01:28:43
  • Java调用.dll文件的方法

    2023-11-23 21:16:22
  • Spring Boot 2结合Spring security + JWT实现微信小程序登录

    2022-07-14 08:25:54
  • SpringBoot配置SSL同时支持http和https访问实现

    2023-04-25 19:42:45
  • 改进c# 代码的五个技巧(一)

    2021-07-17 23:49:30
  • SpringBoot集成Mybatis-plus并实现自动生成相关文件的示例代码

    2023-08-15 04:12:46
  • Spring maven filtering使用方法详解

    2021-07-02 22:14:46
  • java web中 HttpClient模拟浏览器登录后发起请求

    2022-10-27 23:07:05
  • Java 深入浅出分析Synchronized原理与Callable接口

    2021-11-26 10:27:17
  • 彻底解决tomcat中文乱码问题方案

    2023-06-25 17:24:46
  • Java开发中synchronized的定义及用法详解

    2021-11-11 07:01:20
  • asp之家 软件编程 m.aspxhome.com