什么是线程池
线程池(thread pool)是一种线程使用模式。线程过多或者频繁创建和销毁线程会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着管理器分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价,以及保证了线程的可复用性。线程池不仅能够保证内核的充分利用,还能防止过分调度。
线程池的实现
线程池在JAVA平台上已经有成熟的实现方式,本文介绍参考JAVA线程池实现方式实现的C++线程池类库。
该类库项目的下载地址为:https://github.com/xiaoba-8/mixthread
该类库中主要的类的关系如下图所示:
线程池类图
其中,IRuanble为接口类,类似JAVA中的Runnable接口;
DefulatMutext为访问互斥体类,用于临界资源时的加解锁;
RootThread为线程实现的基类,定义了线程中的通用的方法;
CommonThread为一个简单的线程实现类,类似于JAVA中的Thread类;
DefaultThread类为另一线程实现类,以IRunnable为参数,可将IRunnable转化为线程;
ThreadPool为线程池实现类,类似JAVA中的ThreadPool类。
类库的安装方法
- 下载类库实现源代码:https://github.com/xiaoba-8/mixthread
- 进入类库根文件夹依次执行configure,make, make install
类库的使用方法
与JAVA线程池的使用方式相似,首先创建实现IRunnable接口的类,然后交由ThreadPool类实例进行调度即可以。
以下按示例代码:
#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 IsDeleteOnFinish()
{
return true;
}
virtual int Priority()
{
return0;
}
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(intargc, char *argv[])
{
mix::ThreadPool threadPool(10, 20, 5);
printf("Mix Thread Begin\n");
for (int i = 0; i < 5; i++)
{
threadPool.Execute(newDemoThread(i));
}
sleep(1);
while (threadPool.GetActiveCount() >0)
{
sleep(1);
}
printf("Mix Thread End\n");
return 0;
}
- 执行以下命令进行编译,(假设mixthread安装在/usr/local目录下)
g++ -I/usr/local/include/mixthread -g -O2 demo_main.cpp -pthread-o mix_thread_demo -lmixthread -pthread -Wl,-rpath -Wl,/usr/local/lib
生成执行程序mix_thread_demo
执行 ./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: loopindex 2
Thread 3: loopindex 2
Thread 2: loopindex 2
Thread 1: loopindex 2
Thread 0: loopindex 2
Mix Thread End
|
|