Linux如何实现一个线程池
每个任务在放入任务队列时设置好需要处理的数据和处理函数
线程池中的线程负责从任务队列当中获取任务,并进行处理
代码实现过程
创建一个任务类CTask,可以设置处理任务的回调func以及需要处理的数据m_data
创建一个线程池类CThreadPool,成员变量有设置线程池中线程的最大数量thr_max,任务缓冲队列m_queue,互斥量m_mutex,用于实现对缓冲队列的安全性,条件变量m_cond,用于实现线程池中线程的同步
创建任务类
- /* 任务类 */
- class CTask
- {
- public:
- CTask(){}
- ~CTask(){}
- void SetTask(int data, func handler) // 设置数据和处理接口
- {
- m_data = data;
- m_handler = handler;
- }
-
- void Do() // 执行任务
- {
- return m_handler(m_data);
- }
- private:
- int m_data; // 数据
- func m_handler; // 处理接口
- };
创建线程池类
- /* 创建线程池 */
- for (int i = 0; i < m_SumMax; i++)
- {
- pthread_t tid;
- int ret = pthread_create(&tid, NULL, ThrPoolRun, this);
- if (ret != 0)
- {
- printf("thread create error\n");
- }
- }
任务放入队列
- bool TaskPush(CTask &task)
- {
- pthread_mutex_lock(&m_Mutex);
- m_Queue.push(task);
- pthread_mutex_unlock(&m_Mutex);
- pthread_cond_signal(&m_Mond);
- return true;
- }
线程池空闲线程从队列获取任务并处理
- CThreadPool *p = (CThreadPool*)arg;
- while (p->m_bIsRun)
- {
- pthread_mutex_lock(&p->m_Mutex);
- /* 等待任务到来 */
- while (p->m_Queue.empty())
- {
- pthread_cond_wait(&p->m_Mond, &p->m_Mutex);
- }
- /* 取出任务 */
- CTask Task;
- Task =p->m_Queue.front();
- p->m_Queue.pop();
- pthread_mutex_unlock(&p->m_Mutex);
- /* 处理任务 */
- Task.Do();
- }
main函数
- void TaskFunc1(int nData)
- {
- printf("TaskFunc1, ThreadId: %p, nData:%d\n", pthread_self(), nData);
- sleep(1);
- }
- void TaskFunc2(int nData)
- {
- printf("TaskFunc2, ThreadId: %p, nData:%d\n", pthread_self(), nData);
- sleep(1);
- }
- int main(int argc, char const *argv[])
- {
- CThreadPool ThreadPool;
- for (size_t i = 0; i < 10; i++)
- {
- CTask Task;
- (0 == (i % 2)) ? Task.SetTask(i, TaskFunc1) : Task.SetTask(i, TaskFunc2);
- ThreadPool.TaskPush(Task); // 放入任务队列
- }
-
- sleep(3);
- return 0;
- }
|