线程池编程示例
来源:互联网 发布:ubuntu源无法更新 编辑:程序博客网 时间:2024/05/18 01:57
示例代码:
#include#include #include #include #include #include typedef struct worker{void *(*process)(void *arg);void *arg;struct worker *next;}CThread_worker;/*线程池结构*/typedef struct {pthread_mutex_t queue_lock;pthread_cond_t queue_ready;CThread_worker *queue_head;int shutdown;pthread_t *threadid;int max_thread_num;int cur_queue_size; }CThread_pool;int pool_add_worker(void *(*process)(void *arg), void *arg);void *thread_routine(void *arg);static CThread_pool *pool = NULL;void pool_init(int max_thread_num){int i;pool = (CThread_pool *)malloc(sizeof(CThread_pool));pthread_mutex_init(&(pool->queue_lock), NULL);pthread_cond_init(&(pool->queue_ready), NULL);pool->queue_head = NULL;pool->max_thread_num = max_thread_num;pool->cur_queue_size = 0;pool->shutdown = 0;pool->threadid = (pthread_t *)malloc(max_thread_num * sizeof(pthread_t));for (i = 0; i < max_thread_num; i++)pthread_create(&(pool->threadid[i]), NULL, thread_routine, NULL);}int pool_add_worker(void *(*process)(void *arg), void *arg){CThread_worker *member = pool->queue_head;CThread_worker *newworker = (CThread_worker *)malloc(sizeof(CThread_worker));newworker->process = process;newworker->arg = arg;newworker->next = NULL;pthread_mutex_lock(&(pool->queue_lock));if (member != NULL){while(member->next != NULL)member = member->next;member->next = newworker;}else{pool->queue_head = newworker;}assert(pool->queue_head != NULL);pool->cur_queue_size++;pthread_mutex_unlock(&(pool->queue_lock));pthread_cond_signal(&(pool->queue_ready));/*调用pthread_cond_signal来唤醒一个等待线程。若所有线程都在忙,则该语句无效*/return 0;}int pool_destroy(){int i;if (pool->shutdown)return -1;pool->shutdown = 1;pthread_cond_broadcast(&(pool->queue_ready));/*唤醒所有等待线程以便销毁线程池*/for(i = 0; i < pool->max_thread_num; i++){pthread_join(pool->threadid[i], NULL); /*阻塞等待所有线程退出*/}free(pool->threadid);CThread_worker *head = NULL;while(pool->queue_head != NULL) /*依次顺序释放任务链表中的每个任务对应的CThread_worker占用的内存*/{head = pool->queue_head;pool->queue_head = pool->queue_head->next;free(head);}pthread_mutex_destroy(&(pool->queue_lock));pthread_cond_destroy(&(pool->queue_ready)); /*唤醒所有等待线程以便销毁线程池*/free(pool);pool = NULL;return 0;}void *thread_routine(void *arg){printf("start thread 0x%x\n", pthread_self());while(1){pthread_mutex_lock(&(pool->queue_lock));while(pool->cur_queue_size == 0 && !pool->shutdown){printf("thread 0x%x is waiting\n", pthread_self());pthread_cond_wait(&(pool->queue_ready), &(pool->queue_lock));}if (pool->shutdown){pthread_mutex_unlock(&(pool->queue_lock));printf("thread 0x%x will exit\n", pthread_self());pthread_exit(NULL);}assert(pool->cur_queue_size != 0);assert(pool->queue_head != NULL);pool->cur_queue_size--;CThread_worker *worker = pool->queue_head;pool->queue_head = worker->next;pthread_mutex_unlock(&(pool->queue_lock));(*(void *)(worker->process)((void *)worker->arg));free(worker);worker = NULL;}pthread_exit(NULL);}void *myprocess(void *arg){printf("threadid is 0x%x, working on task %d\n", pthread_self(), *(int *)arg);sleep(1);return NULL;}int main(int argc, char **argv){pool_init(3);int *workingnum = (int *)malloc(sizeof(int) * 10);int i;for (i=0; i < 10; i++){workingnum[i] = i;pool_add_worker(myprocess, &workingnum[i]);}sleep(5);pool_destroy();free(workingnum);return 0;}
编译完成后执行结果如下:
ubuntu:~$ ./threadpool
start thread 0xb751bb40
threadid is 0xb751bb40, working on task 0
start thread 0xb6d1ab40
threadid is 0xb6d1ab40, working on task 1
start thread 0xb6519b40
threadid is 0xb6519b40, working on task 2
threadid is 0xb751bb40, working on task 3
threadid is 0xb6d1ab40, working on task 4
threadid is 0xb6519b40, working on task 5
threadid is 0xb751bb40, working on task 6
threadid is 0xb6d1ab40, working on task 8
threadid is 0xb6519b40, working on task 7
threadid is 0xb751bb40, working on task 9
thread 0xb6d1ab40 is waiting
thread 0xb6519b40 is waiting
thread 0xb751bb40 is waiting
thread 0xb6d1ab40 will exit
thread 0xb6519b40 will exit
thread 0xb751bb40 will exit
阅读全文
0 0
- 线程池编程示例
- 多线程Java Socket编程示例 线程池
- pthread线程属性编程示例
- C# 线程池示例
- 线程池示例代码
- 线程池示例代码
- linux线程池示例
- python线程池示例
- Java多线程编程#执行线程示例
- socket编程代码示例(单线程)
- MUD游戏编程 示例3.1基本线程
- Java线程 - 固定大小线程池示例
- java线程(线程池工作示例)
- 线程池的使用示例
- 线程池应用小示例
- boost线程池简单示例
- 线程池多线程使用示例
- 【Java】ExecutorService线程池示例
- centos增加yum源方法
- Leetcode之Missing Number 问题
- 数据结构--线性链式表倒数第K项
- dubbo 配置文件详解
- 解决window 热键(快捷键)占用问题
- 线程池编程示例
- iOS之Xcode 9 快捷键查看类或方法声明定义
- Java设计模式_(结构型)_组合模式
- Android greendao将数据库存在SD卡
- Java 自带四种线程池的使用
- unity新版粒子特效的组件获取
- Java后台如何实现跨域请求接口
- Eclipse远程调试Tomcat
- ZOJ2706-Thermal Death of the Universe