一种简易的C++线程池实现

什么是线程池

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

线程池的实现

       线程池在JAVA平台上已经有成熟的实现方式,本文介绍参考JAVA线程池实现方式实现的C++线程池类库。
       该类库代码已上传至github仓库中,下载地址为:https://github.com/xiaoba-8/mixthread
       该类库中主要的类的关系如下图所示:


线程池类图

       其中,i_ruanble为接口类,类似JAVA中的Runnable接口;
       thread_mutext为访问互斥体类,用于临界资源时的加解锁;
       root_thread为线程实现的基类,定义了线程中的通用的方法;
       mix_hread为一个简单的线程实现类,类似于JAVA中的Thread类;
       thread_proxy类为另一线程实现代理类,以i_runnable为参数,可将i_runnable转化为线程;
      thread_pool为线程池实现类,类似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/thread_pool.h>

class DemoThread: public mix::i_runnable
{
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 IsDeleteOnFinish()
       {
              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::thread_pool 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 -omix_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: loopindex 0
    Thread 4: loopindex 0
    Thread 2: loopindex 0
    Thread 1: loopindex 0
    Thread 0: loopindex 0
    Thread 4: loopindex 1
    Thread 3: loopindex 1
    Thread 2: loopindex 1
    Thread 1: loopindex 1
    Thread 0: loopindex 1
    Thread 4: loop index2
    Thread 3: loopindex 2
    Thread 2: loopindex 2
    Thread 1: loopindex 2
    Thread 0: loopindex 2
    Mix Thread End

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。