利用Linux系统函数实现线程池(C++)
来源:互联网 发布:大师兄 知乎 编辑:程序博客网 时间:2024/05/16 04:25
昨天在笔试freewheel遇到一个编程题,要求实现C语言的线程池,可以利用Linux的系统函数,自己尝试写了写,但是由于函数调用回调的参数不知道该怎么写,实现的并不好。今天在博客上搜了搜,发现有人给出了实现,但是代码贴得太乱,所以自己转载过来,方便自己和他人以后用的时候看一下。
Thread.h
#ifndef __THREAD_H#define __THREAD_H#include <vector>#include <string>#include <pthread.h>using namespace std;/** * 执行任务的类,设置任务数据并执行 */class CTask{protected:string m_strTaskName; /** 任务的名称 */void* m_ptrData; /** 要执行的任务的具体数据 */public:CTask(){}CTask(string taskName){m_strTaskName = taskName;m_ptrData = NULL;}virtual int Run()= 0;void SetData(void* data); /** 设置任务数据 */public:virtual ~CTask(){}};/** * 线程池管理类的实现 */class CThreadPool{private:static vector<CTask*> m_vecTaskList; /** 任务列表 */staticbool shutdown; /** 线程退出标志 */ int m_iThreadNum; /** 线程池中启动的线程数 */pthread_t*pthread_id;static pthread_mutex_t m_pthreadMutex; /** 线程同步锁 */static pthread_cond_t m_pthreadCond; /** 线程同步的条件变量 */protected:static void* ThreadFunc(void * threadData); /** 新线程的线程回调函数 */static int MoveToIdle(pthread_t tid); /** 线程执行结束后,把自己放入到空闲线程中 */static int MoveToBusy(pthread_t tid); /** 移入到忙碌线程中去 */int Create(); /** 创建线程池中的线程 */public:CThreadPool(int threadNum = 10);int AddTask(CTask *task); /** 把任务添加到任务队列中 */int StopAll(); /** 使线程池中的线程退出 */int getTaskSize(); /** 获取当前任务队列中的任务数 */};#endif
实现文件
Thread.cpp
#include "Thread.h"#include <iostream>void CTask::SetData(void * data){m_ptrData = data;}vector<CTask*> CThreadPool::m_vecTaskList; //任务列表bool CThreadPool::shutdown = false;pthread_mutex_t CThreadPool::m_pthreadMutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t CThreadPool::m_pthreadCond = PTHREAD_COND_INITIALIZER;/** * 线程池管理类构造函数 */CThreadPool::CThreadPool(int threadNum){this->m_iThreadNum = threadNum;cout << "I will create " << threadNum << " threads" << endl;Create();}/** * 线程回调函数 */void* CThreadPool::ThreadFunc(void* threadData){pthread_t tid = pthread_self();while (1){pthread_mutex_lock(&m_pthreadMutex);while (m_vecTaskList.size() == 0 && !shutdown){pthread_cond_wait(&m_pthreadCond, &m_pthreadMutex);}if (shutdown){pthread_mutex_unlock(&m_pthreadMutex);printf("thread %lu will exit/n", pthread_self());pthread_exit(NULL);}printf("tid %lu run/n", tid);vector<CTask*>::iterator iter = m_vecTaskList.begin();/*** 取出一个任务并处理之*/CTask* task = *iter;if (iter != m_vecTaskList.end()){task = *iter;m_vecTaskList.erase(iter);}pthread_mutex_unlock(&m_pthreadMutex); task->Run(); /** 执行任务 */printf("tid:%lu idle/n", tid);}return (void*)0;}/** * 往任务队列里边添加任务并发出线程同步信号 */int CThreadPool::AddTask(CTask *task){pthread_mutex_lock(&m_pthreadMutex);this->m_vecTaskList.push_back(task);pthread_mutex_unlock(&m_pthreadMutex);pthread_cond_signal(&m_pthreadCond);return 0;}/** * 创建线程 */int CThreadPool::Create(){pthread_id = (pthread_t*)malloc(sizeof(pthread_t) * m_iThreadNum);for(int i = 0; i < m_iThreadNum; i++){pthread_create(&pthread_id[i], NULL, ThreadFunc, NULL);}return 0;}/** * 停止所有线程 */int CThreadPool::StopAll(){/** 避免重复调用 */if (shutdown){return -1;}printf("Now I will end all threads!!/n");/** 唤醒所有等待线程,线程池要销毁了 */shutdown = true; pthread_cond_broadcast(&m_pthreadCond); /** 阻塞等待线程退出,否则就成僵尸了 */ for (int i = 0; i < m_iThreadNum; i++) { pthread_join(pthread_id[i], NULL); }free(pthread_id);pthread_id = NULL; /** 销毁条件变量和互斥体 */ pthread_mutex_destroy(&m_pthreadMutex); pthread_cond_destroy(&m_pthreadCond); return 0;}/** * 获取当前队列中任务数 */int CThreadPool::getTaskSize(){return m_vecTaskList.size();}
#include "Thread.h"#include <iostream>class CMyTask: public CTask{public:CMyTask(){}inline int Run(){printf("%s/n", (char*)this->m_ptrData);sleep(10);return 0;}};int main(){CMyTask taskObj;char szTmp[] = "this is the first thread running";taskObj.SetData((void*)szTmp);CThreadPool threadPool(10);for(int i = 0; i < 20; i++){threadPool.AddTask(&taskObj);}while(1){printf("there are still %d tasks need to handle/n", threadPool.getTaskSize());if (threadPool.getTaskSize() == 0){if (threadPool.StopAll() == -1){printf("Now I will exit from main/n");exit(0);}}sleep(2);}return 0;}
Makefile文件
CC := g++TARGET := threadpoolINCLUDE := -I./LIBS := -lpthread # C++语言编译参数CXXFLAGS := -g -Wall -D_REENTRANT # C预处理参数# CPPFLAGS := OBJECTS := test.o Thread.o $(TARGET): $(OBJECTS) $(CC) -o $(TARGET) $(OBJECTS) $(LIBS) # $@表示所有目标集%.o:%.cpp $(CC) -c $(CXXFLAGS) $(INCLUDE) $< -o $@ .PHONY : cleanclean: -rm -f $(OBJECTS) $(TARGET)
I will create 10 threadsthere are still 10 tasks need to handletid 3086535568 runthis is the first thread runningtid 3084434320 runthis is the first thread runningtid 3082333072 runthis is the first thread runningtid 3080231824 runthis is the first thread runningtid 3078130576 runthis is the first thread runningtid 3076029328 runthis is the first thread runningtid 3073928080 runthis is the first thread runningtid 3071826832 runthis is the first thread runningtid 3069725584 runthis is the first thread runningtid 3067624336 runthis is the first thread runningthere are still 0 tasks need to handleNow I will end all threads!!tid:3086535568 idletid:3078130576 idlethread 3078130576 will exittid:3076029328 idlethread 3076029328 will exittid:3073928080 idlethread 3073928080 will exittid:3071826832 idlethread 3071826832 will exittid:3069725584 idlethread 3069725584 will exittid:3067624336 idlethread 3067624336 will exittid:3084434320 idlethread 3084434320 will exitthread 3086535568 will exittid:3082333072 idlethread 3082333072 will exittid:3080231824 idlethread 3080231824 will exitthere are still 0 tasks need to handleNow I will exit from main
0 0
- 利用Linux系统函数实现线程池(C++)
- linux系统c线程池的实现
- Linux C系统编程:使用线程池,实现cp功能
- VC ++ 利用系统函数 QueueUserWorkItem 实现线程例子
- VC ++ 利用系统函数 QueueUserWorkItem 实现线程例子
- Linux C 实现线程池
- linux C线程池实现
- linux c 实现线程池
- Linux C:利用两个线程实现生产者消费者模型
- linux下利用系统函数实现rm -rf的功能!
- linux系统c++线程池的实现
- Linux线程池C语言实现
- linux线程池的C语言实现
- linux线程池的C语言实现
- linux线程池的C语言实现
- linux线程池的C语言实现
- Linux下C线程池的实现
- linux线程池的C语言实现
- 起凡 群雄逐鹿 改键器 连发器 神器 v1.4
- 开启ubuntu默认root的权限(su: Authentication failure)
- 蟠桃记
- Android Api Demos登顶之路(104)View-->Custom
- 基于用户的协同过滤算法的讨论
- 利用Linux系统函数实现线程池(C++)
- 母牛的故事
- 查看和修改mysql5.6端口
- 实验一小下
- 论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因
- SD卡
- android学习4:Service
- c++笔记总结之常类型
- 水仙花数