灯具网站建设网站开发产品设计公司
2026/4/16 19:36:03 网站建设 项目流程
灯具网站建设,网站开发产品设计公司,河南做外贸网站的公司简介,网站建设织梦怎么样文章目录线程池的优点线程池的四大核心#xff08;组件#xff09;任务队列工作线程管理者控制开关实现步骤创建线程池工作线程的行为添加任务销毁线程池关键数据结构示例注意事项如果每个任务创建新线程#xff0c;任务结束即销毁线程#xff0c;资源的消耗和开销也不小固…文章目录线程池的优点线程池的四大核心组件任务队列工作线程管理者控制开关实现步骤创建线程池工作线程的行为添加任务销毁线程池关键数据结构示例注意事项如果每个任务创建新线程任务结束即销毁线程资源的消耗和开销也不小固定数量的线程处理多个任务实现线程复用线程池的优点避免频繁创建/销毁线程的开销控制并发线程数量避免资源耗尽提高响应速度任务无需等待线程创建线程池的四大核心组件任务队列待办清单工作线程员工团队管理者协调工具控制开关任务队列使用链表实现的 FIFO 队列每个任务包含任务函数指针要执行的操作参数执行所需数据指向下一个任务的指针structTask{void(*function)(void*);// 任务函数做什么void*arg;// 参数用什么做structTask*next;// 下一个任务};工作线程固定数量的线程如 CPU 核心数 × 2每个线程循环等待任务 → 取出任务 → 执行任务whileTrue:等待任务-取出任务-执行任务管理者互斥锁mutex保护共享资源任务队列条件变量cond线程间通信通知新任务到达控制开关shutdown 标志安全关闭信号优雅终止线程池实现步骤第一步创建线程池第二步工作线程的行为第三步添加任务第四步销毁线程池创建线程池ThreadPool*thread_pool_create(){// 分配内存// 初始化互斥锁和条件变量// 初始化任务队列// 设置 shutdown 标志为 0// 创建固定数量的工作线程}工作线程的行为void*worker(void*arg){while(1){上锁;while(无任务且不关闭){等待条件变量;}if(需要关闭)退出;取出任务;解锁;执行任务;释放任务内存;}}添加任务intthread_pool_add_task(ThreadPool*pool,函数指针,参数){// 创建新任务节点// 上锁// 加入队列尾部// 发送条件信号// 解锁}销毁线程池voidthread_pool_destroy(ThreadPool*pool){// 设置 shutdown 标志为 1// 广播通知所有线程// 等待所有线程退出// 清理剩余任务// 销毁锁和条件变量// 释放内存}关键数据结构typedefstructTask{void(*function)(void*);// 任务函数void*arg;// 参数structTask*next;// 下一个任务}task_t;typedefstructThreadPool{pthread_mutex_tmutex;// 互斥锁pthread_cond_tcond;// 条件变量pthread_tthreads[THREAD_NUM];// 线程数组task_t*task_head;// 任务队列头task_t*task_tail;// 任务队列尾intshutdown;// 关闭标志}tpool_t;示例#includepthread.h#includestdlib.h#includestdio.h#includeunistd.h#defineTHREAD_NUM4//任务队列typedefstructTask{void(*function)(void*);void*arg;structTask*next;}task_t;//线程池结构体typedefstructthread_pool{pthread_mutex_tmutex;pthread_cond_tcond;pthread_ttid[THREAD_NUM];task_t*task_head;task_t*task_tail;intshutdown;//线程池的开关0代表使用1代表销毁}tpool_t;//工作线程void*worker(void*arg){tpool_t*pool(tpool_t*)arg;while(1){//1. 锁定临界资源pthread_mutex_lock(pool-mutex);//2. 等待任务while(pool-task_headNULL!pool-shutdown){pthread_cond_wait(pool-cond,pool-mutex);}//3. 检查线程开关if(pool-shutdown){pthread_mutex_unlock(pool-mutex);pthread_exit(NULL);}//4. 取出任务task_t*taskpool-task_head;if(taskNULL){pthread_mutex_unlock(pool-mutex);continue;}//5. 列新任务队列pool-task_headtask-next;if(pool-task_headNULL){pool-task_tailNULL;}//6. 解锁pthread_mutex_unlock(pool-mutex);//7. 执行任务task-function(task-arg);free(task);}returnNULL;}//创建线程池tpool_t*thread_pool_init(){//1. 为线程池结构体申请内存tpool_t*poolmalloc(sizeof(tpool_t));if(poolNULL){returnNULL;}//2. 初始化互斥量条件变量pthread_mutex_init(pool-mutex,NULL);pthread_cond_init(pool-cond,NULL);//3. 初始化队列pool-task_headNULL;pool-task_tailNULL;//4. 初始化线程池的开关pool-shutdown0;//5. 创建工作线程for(inti0;iTHREAD_NUM;i){pthread_create(pool-tid[i],NULL,worker,pool);}returnpool;}//添加任务队列 添加成功返回0失败返回 -1intthread_pool_add_task(tpool_t*pool,void(*function)(void*),void*arg){//1. 创建新任务task_t*new_taskmalloc(sizeof(task_t));if(new_taskNULL){return-1;}new_task-functionfunction;new_task-argarg;new_task-nextNULL;//2. 锁定临界资源pthread_mutex_lock(pool-mutex);//3. 加入队列if(pool-task_tailNULL){pool-task_headpool-task_tailnew_task;}else{pool-task_tail-nextnew_task;pool-task_tailnew_task;}//4. 通知工作线程并解锁pthread_cond_signal(pool-cond);pthread_mutex_unlock(pool-mutex);return0;}//销毁线程池intthread_pool_destroy(tpool_t*pool){//1. 关闭线程池pthread_mutex_lock(pool-mutex);pool-shutdown1;pthread_mutex_unlock(pool-mutex);//2. 唤醒所有等待的线程pthread_cond_broadcast(pool-cond);//3. 等待所有线程退出for(inti0;iTHREAD_NUM;i){pthread_join(pool-tid[i],NULL);}//4. 释放各种资源task_t*ppool-task_head;while(p!NULL){task_t*tempp;pp-next;free(temp);}pthread_mutex_destroy(pool-mutex);pthread_cond_destroy(pool-cond);free(pool);return0;}/*线程池功能测试*/voidcook(void*arg){intorder_id*(int*)arg;printf(厨师%lu 开始制作订单%d\n,pthread_self(),order_id);sleep(1);// 模拟烹饪时间printf(订单%d 完成\n,order_id);}intmain(intargc,constchar*argv[]){// 创建线程池tpool_t*poolthread_pool_init();if(poolNULL){}// 添加任务intorders[10];for(inti0;i10;i){orders[i]1000i;thread_pool_add_task(pool,cook,orders[i]);}sleep(4);// 销毁线程池thread_pool_destroy(pool);return0;}注意事项任务函数设计适合独立计算、文件操作、网络请求避免长时间阻塞操作如等待用户输入线程数量设置经验公式CPU 核心数 × 2过多线程会增加上下文切换开销访问共享资源队列前必须加锁使用条件变量进行线程间通信确保销毁时所有资源被正确释放

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询