终于贴完代码了。
值得留意的是,MyWorkThread与MyThreadPool存在着互相调用的关系,因此如果像平常那样做的话会出现头文件互相包含而导致的编译错误
这个问题我没深入研究,查过一些解决方法,这里是一篇
虽然不是原创,但应该说的都说到了。
我这套代码使用的是以下这种方法
使用类声明
在超前引用一个类之前,首先用一个特殊的语句说明该标识符是一个类名,即将被超前引用。其使用方法是:
a) 用class ClassB;声明即将超前引用的类名
b) 定义class ClassA
c) 定义class ClassB;
d) 编制两个类的实现代码。
上述方法适用于所有代码在同一个文件中,一般情况下,ClassA和ClassB分别有自己的头文件和cpp文件,这种
方法需要演变成:
a) 分别定义ClassA和ClassB,并在cpp文件中实现之
b) 在两个头文件的开头分别用class ClassB;和class ClassA;声明对方
c) 在两个cpp文件中分别包含另外一个类的头文件
NOTE:这种方法切记不可使用类名来定义变量和函数的变量参数,只可用来定义引用或者指针。
最后编译通过并运行得到以下结果
MoveToBusyList
Thread 3074677568 Run the job: 0
MoveToBusyList
Thread 3066284864 Run the job: 1
MoveToBusyList
Thread 3057892160 Run the job: 2
this is the job 2
MoveToIdleList
this is the job 0
MoveToIdleList
this is the job 1
MoveToIdleList
MoveToBusyList
Thread 3057892160 Run the job: 3
MoveToBusyList
Thread 3074677568 Run the job: 4
this is the job 3
MoveToIdleList
this is the job 4
MoveToIdleList
可看出main创建包含3个线程的线程池,而加入5条job,超出了线程的最大值目,因此第4条开始会阻塞,一直等到存在空闲线程(阻塞,在MyThreadPool的Run函数中的GetIdleThread)时才会运行下一条job
这个算是一个简单的C++线程池实现,有很多不足的地方,以后有机会再改进。