C++简易线程池
C++简易线程池
原理:
thread a = thread(theadProc,param);
线程构造以后,线程执行的函数就不能改变了,一旦函数运行结束,线程也就终止。
所以要实现线程不停的切换任务,就只能对param动手了。
让param变成一个装有函数指针以及该函数执行所需参数的数据结构。
让线程池和线程通过param参数来交换数据,分配任务。
1.函数指针。
代码:
#include
#include
using namespace std;
int add(int a,int b)
{
return a + b;
}
int main()
{
using ADD = int(*)(int,int);//函数指针类型
LPVOID a= (LPVOID)&add;
ADD adda = (ADD)a;
cout<
2.线程间同步。
可见本人另一篇博客。
3.代码:
#include
#include
#include
#include
#include
using namespace std;
#define THREA_NUM 4
mutex mu;
mutex mu2;
HANDLE sem;
HANDLE semHave;
//线程池和线程就通过这个结构交换数据
struct WORK
{
PVOID work;
PVOID param;
};
//简单起见,就让每个线程做一样的任务
void* print(void* num)
{
mu.lock();
printf("this is print %d work,num = %d\n",this_thread::get_id(),(int)num);
mu.unlock();
}
void* print2(void* num)
{
mu.lock();
printf("this is print2 %d work, = %d\n",this_thread::get_id(),(int)num);
mu.unlock();
}
using PRINT = void*(*)(void*);
void threadToWork(WORK &work)
{
while(1)
{
WaitForSingleObject(sem,INFINITE);//通过信号量,让线程接受任务
PRINT print = (PRINT)(work.work);
print(work.param);
mu2.lock();
work.work = 0;
mu2.unlock();
ReleaseSemaphore(semHave,1,NULL);//任务执行完毕,通知线程池
}
}
struct threadPool
{
queue q;//任务队列,也没有设置容量
thread xcArr[THREA_NUM];//线程句柄数组
WORK haveWork[THREA_NUM];//每个线程的数据
void start()
{
sem = CreateSemaphore(NULL,0,THREA_NUM,"semaphore");
semHave = CreateSemaphore(NULL,THREA_NUM,THREA_NUM,"semaphorehave");
for(int i=0;i
确实是够简易的,不过好在只是简单的打印还是足够胜任了。
过于简易,所以问题很多,创建的线程都还没结束呢,主线程就完了。
还要分配任务的时候,修改了线程2的数据。但是可能释放的信号量给了线程3呢。