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

网友投稿 370 2023-01-01


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

什么是线程池

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

线程池的实现

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

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

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

线程池类图

其中,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)

http:// {

}

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 indehttp://x 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

总结


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:接口测试工具连数据库(怎么连接测试数据库)
下一篇:微服务网关效果图(微服务网关架构图)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~