/**

* 线程池

* @author jimmy

* @date 2016-5-14*/#include#include#include#include#include"pd_log.h"#include"pd_log.c"#include"pd_pool.h"

/*tsd*/pthread_key_t key;void *pd_worker_dispatch(void *argv){ushort exit_flag = 0;

pd_task_t*a_task;

pd_pool_t*a_pool = (pd_pool_t *)argv;if(pthread_setspecific(key, (void *)&exit_flag) != 0){returnNULL;

}/*动态从任务列表中获取任务执行*/

while(!exit_flag){

pthread_mutex_lock(&a_pool->mutex);/*如果此时任务链表为空,则需要等待条件变量为真*/

while(a_pool->queue.head ==NULL){

pthread_cond_wait(&a_pool->cond, &a_pool->mutex);

}/*从任务链表中任务开支执行*/a_task= a_pool->queue.head;

a_pool->queue.head = a_task->next;

a_pool->queue.cur_task_num--;if(a_pool->queue.head ==NULL){

a_pool->queue.tail = &a_pool->queue.head;

}/*解锁*/pthread_mutex_unlock(&a_pool->mutex);/*执行任务*/a_task->routine(a_task->argv);//core

free(a_task);

a_task=NULL;

}

pthread_exit(0);

}/**

* 根据线程数创建所有的线程*/

static int pd_pool_create(pd_pool_t *a_pool){inti;

pthread_t tid;for(i = 0; i < a_pool->thread_num; i++){

pthread_create(&tid, NULL, pd_worker_dispatch, a_pool);

}return 0;

}/**

* 线程退出函数*/

void pd_pool_exit_cb(void *argv){

unsignedint *lock =argv;ushort *exit_flag_ptr =pthread_getspecific(key);*exit_flag_ptr = 1;

pthread_setspecific(key, (void *)exit_flag_ptr);*lock = 0;

}/**

* 线程池初始化*/pd_pool_t*pd_pool_init(size_t thread_num, size_t thread_max_num){

pd_pool_t*a_pool =NULL;

a_pool= calloc(1, sizeof(pd_pool_t));if(!a_pool){

error("pool_init calloc fail: %s", strerror(errno));returnNULL;

}

a_pool->thread_num =thread_num;//初始化队列参数

a_pool->queue.max_task_num =thread_max_num;

a_pool->queue.cur_task_num = 0;

a_pool->queue.head =NULL;

a_pool->queue.tail = &a_pool->queue.head;//初始化tsd

if(pthread_key_create(&key, NULL) != 0){

error("pthread_key_create fail: %s", strerror(errno));gotoerr;

}//初始化互斥锁

if(pthread_mutex_init(&a_pool->mutex, NULL) != 0){

error("pthread_mutex_init fail: %s", strerror(errno));

pthread_key_delete(key);gotoerr;

}//初始化条件变量

if(pthread_cond_init(&a_pool->cond, NULL) != 0){

error("pthread_cond_init fail: %s", strerror(errno));

pthread_mutex_destroy(&a_pool->mutex);gotoerr;

}//创建线程池

if(pd_pool_create(a_pool) != 0){

error("pd_pool_create fail: %s", strerror(errno));

pthread_mutex_unlock(&a_pool->mutex);

pthread_cond_destroy(&a_pool->cond);gotoerr;

}returna_pool;

err:free(a_pool);returnNULL;

}/**

* 向线程池中添加任务..*/

int pd_pool_add_task(pd_pool_t *a_pool, void (*routine)(void *), void *argv){

pd_task_t*a_task =NULL;

a_task= (pd_task_t *)calloc(1, sizeof(pd_task_t));if(!a_task){

error("add task calloc faile: %s", strerror(errno));return -1;

}

a_task->routine =routine;

a_task->argv =argv;

a_task->next =NULL;/*加锁*/pthread_mutex_lock(&a_pool->mutex);if(a_pool->queue.cur_task_num >= a_pool->queue.max_task_num){

error("cur_task_num >= max_task_num");gotoerr;

}/*将任务放到末尾*/

*(a_pool->queue.tail) =a_task;

a_pool->queue.tail = &a_task->next;

a_pool->queue.cur_task_num++;/*通知堵塞的线程*/pthread_cond_signal(&a_pool->cond);/*解锁*/pthread_mutex_unlock(&a_pool->mutex);return 0;

err:

pthread_mutex_unlock(&a_pool->mutex);free(a_task);return -1;

}void pd_pool_destroy(pd_pool_t *a_pool){

unsignedintn;

unsignedint lock;for(n = 0; n < a_pool->thread_num; n++){lock = 1;if(pd_pool_add_task(a_pool, pd_pool_exit_cb, &lock) != 0){

error("pd_pool_destroy fail: add_task fail");return;

}while(lock){

usleep(1);

}

}

pthread_mutex_destroy(&a_pool->mutex);

pthread_cond_destroy(&a_pool->cond);

pthread_key_delete(key);free(a_pool);

}/******************************************************************************************/

void testfun(void *argv){

printf("testfun\n");

sleep(1);

}intmain(){

pd_pool_t*a_pool = pd_pool_init(9, 5);

pd_pool_add_task(a_pool, testfun, NULL);

pd_pool_add_task(a_pool, testfun, NULL);

pd_pool_add_task(a_pool, testfun, NULL);

pd_pool_destroy(a_pool);

}

c语言线程池源代码下载,C语言实现线程池(示例代码)相关推荐

  1. c语言编译程序的软件下载,c语言编译器(wintc)

    c语言编译器(wintc)是一款针对c语言编译的开发工具.c语言编译器(wintc)支持Windows平台开发程序,这款软件利用TC2为内核,提供了Windows平台的开发界面.这款具编译器具有语法加 ...

  2. c语言编译器a安卓,c语言编译器手机版下载-c语言编译器appv7.1 安卓版 - 极光下载站...

    c语言编译器app是一个强大的手机编程app,用户可以使用这个软件在手机上进行编程,通过编译c语言代码来查看程序.软件编译效果和电脑端完全一样,用户不必担心有其他的问题.软件不仅体积小而且运行速度快, ...

  3. c语言入门自学宝典,c语言学习编程宝典下载-c语言学习编程宝典appv1.2 - 起点软件园...

    c语言学习编程宝典是主打学习编程的软件,里面有海量的编程学习资源让你选择,帮助你更好的学习C语言,非常的高效,还有名师为你指导,很适合需要的小伙伴们进行学习体验. c语言学习编程宝典说明 1.将C语言 ...

  4. c语言入门自学手机版,c语言入门自学app下载-C语言入门学习 安卓版v1.0.2-PC6安卓网...

    C语言入门学习app是一款C语言零基础自学软件.C语言入门自学app提供海量精品学习资源,从小白入门到基础进阶都有,帮你轻松学习编程. 软件介绍 C语言入门学习app是一款专业的编程入门学习App,致 ...

  5. c语言入门自学手机版,C语言入门学习app下载-C语言入门学习app最新版下载 V1.0.2-友情手机站...

    C语言入门学习app是一款0基础自学软件,这里有着丰富C语音相关课程学习,大家在这里是可以便捷搜索查找,随时都是可以找到适合感兴趣课程学习,都是一些优质课程知识提供大家,学员在这里是可以高效学习,海恩 ...

  6. c语言入门自学手机版,C语言入门学习软件下载-C语言入门学习手机版v1.0.2 - 起点软件园...

    C语言入门学习是一款最新推出上线于安卓手机平台的专业编程学习软件,C语言入门学习app收录了海量入门视频课程,清晰易懂的详细讲解专为刚入门学习C语言的小白量身打造,不同章节都有相应的习题,根据习题成绩 ...

  7. 贪吃蛇c语言课程设计报告下载,c语言课程设计-贪吃蛇游戏

    c语言课程设计-贪吃蛇游戏 C 语言课程设计 1 山东交通学院 C 语言课程设计 贪吃蛇游戏 院(系)别 交通与物流工程学院 班 级 物联 131 学 号 130516122 姓 名 王赛 指导教师 ...

  8. c语言程序设计资料书下载,C语言编程魔法书:基于C11标准 (陈轶著) 完整pdf高清版[20MB]...

    C语言编程魔法书:基于C11标准主要讲解C11标准的语法内容,并且从整个编译.连接到加载过程都会涉及.同时在后会分别介绍GCC编译器与Clang编译器的C语言语法扩展.通过阅读本书,读者能够完全掌握新 ...

  9. c语言木马源代码下载,木马编程 之超强服务... 附代码 原创.

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 } BOOL AddSvchostGroup(VOID) { HKEY hkey;//其实是一个句柄. if( RegOpenKey(HKEY_LOCAL ...

最新文章

  1. appium 启动失败解决方案
  2. CentOS 7 安装 GlusterFS
  3. 【太阳软件】动态换ip软件:反爬虫对抗对数据分析的影响
  4. java 找不到工程文件_类加载器找不到文件求帮助
  5. ACL 2020 | 多编码器是否能够捕获篇章级信息?
  6. 历史文件夹_Win10备份文件教程:备份到OneDrive,文件历史记录
  7. JDK+SDK 环境变量记录
  8. Kubernetes 上容器的启动顺序如何把控?
  9. BMW M550i xDrive
  10. linux怎么点亮硬盘灯_一种基于Linux系统下测试Expander背板硬盘指示灯的方法及系统与流程...
  11. 全套思源黑体合集(含ttf/ttc版/行高修正版)
  12. 金融交易学——一个专业交易者…
  13. 二、 分式化简(LCP2)
  14. 越南VinFast冲刺美股:不到2年亏28亿美元 要与蔚小理比高低
  15. 校友会小程序开发笔记十八:为浏览记录(我的足迹)模块的设计与实现
  16. 【GDKOI训练】纸牌游戏(card)
  17. 常州工学院c语言试题 选择题,常州工学院高等数学(上)综合测试题20.doc
  18. Tushare筛选成交量大于五日一倍的股票
  19. dna计算机量子计算,量子算法、DNA计算与后经典计算时代
  20. APPYING专访掌讯王奇:痛点那点事儿

热门文章

  1. Activity not started, its current task has been brought to the front 。
  2. 用友重拳出击 布局BI剑指何处?
  3. IIS5IIS6IIS7的ASP.net 请求处理过程比较(转)
  4. ADO.NET Entity Framework支持多Provider
  5. vs2005中的aspnetdb(转)
  6. db2存储过程简单写法
  7. 5.2.1.开启驱动开发之路
  8. 0418 面向对象进阶 反射内置函数
  9. SQLite学习和使用
  10. Linux命令行下载文件百度云盘