if (pool->threads)
{
free(pool->threads);
pthread_mutex_lock(&(pool->lock)); /*先锁住再销毁*/
pthread_mutex_destroy(&(pool->lock));
pthread_mutex_lock(&(pool->thread_counter));
pthread_mutex_destroy(&(pool->thread_counter));
pthread_cond_destroy(&(pool->queue_not_empty));
pthread_cond_destroy(&(pool->queue_not_full));
}
free(pool);
pool = NULL;
return 0;
}
/*销毁线程池*/六、接口
int
threadpool_destroy(threadpool_t *pool)
{
int i;
if (pool == NULL)
{
return -1;
}
pool->shutdown = true;
/*销毁管理者线程*/
pthread_join(pool->admin_tid, NULL);
//通知所有线程去自杀(在自己领任务的过程中)
for (i=0; i<pool->live_thr_num; i++)
{
pthread_cond_broadcast(&(pool->queue_not_empty));
}
/*等待线程结束 先是pthread_exit 然后等待其结束*/
for (i=0; i<pool->live_thr_num; i++)
{
pthread_join(pool->threads[i], NULL);
}
threadpool_free(pool);
return 0;
}
/* 线程池初始化 , 其管理者线程及工作线程都会启动 */需要C/C++ linux服务器开发学习资料私信“资料”(资料包括C/C++ , Linux , golang技术 , Nginx , ZeroMQ , MySQL , redis , fastdfs , MongoDB , ZK , 流媒体 , CDN , P2P , K8S , Docker , TCP/IP , 协程 , DPDK , ffmpeg等) , 免费分享
threadpool_t *thp = threadpool_create(10, 100, 100);
printf("threadpool init ... ... n");
/* 接收到任务后添加 */
threadpool_add_task(thp, do_work, (void *)p);
// ... ...
/* 销毁 */
threadpool_destroy(thp);
推荐阅读
- 超详细的Socket通信原理和实例讲解
- Nginx高级篇:从原理到实战,彻底搞懂Nginx
- Mybatis原理
- 你是我的城池营垒2话本小说 你是我的城池营垒有小说吗
- 油电混动的车电池坏了,只加油不充电,能当纯汽油车来开吗?
- 电池|DXOMARK如何测试电池成绩?官方晒实验室:把手机关“笼子”里无情狂点
- 小米|9.9元买不到了!小米旗下爆品彩虹电池涨价了:现卖13.9元
- 新能源汽车多久要换一次电池?
- 世界上最深的游泳池 世界上最神奇的泳池
- 写爬虫时,IP经常被封?那么如何正确的搭建属于自己的IP代理池