线程池的使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。
下面是Linux系统下用C语言创建的一个线程池。线程池会维护一个任务链表(每个CThread_worker结构就是一个任务)。
pool_init()函数预先创建好max_thread_num个线程,每个线程执thread_routine ()函数。该函数中
1. while (pool->cur_queue_size == 0)
2. {
3. pthread_cond_wait (&(pool->queue_ready),&(pool->queue_lock));
4. }
表示如果任务链表中没有任务,则该线程出于阻塞等待状态。否则从队列中取出任务并执行。
pool_add_worker()函数向线程池的任务链表中加入一个任务,加入后通过调用
pthread_cond_signal (&(pool->queue_ready))唤醒一个出于阻塞状态的线程(如果有的话)。
pool_destroy ()函数用于销毁线程池,线程池任务链表中的任务不会再被执行,但是正在运行的线程会一直把任务运行完后再退出。
下面贴出完整代码
1. #include
2. #include
3. #include
4. #include
5. #include
6. #include
7.
8. /*
9. *线程池里所有运行和等待的任务都是一个CThread_worker
10. *由于所有任务都在链表里,所以是一个链表结构
11. */
12. typedef struct worker
13. {
14. /*回调函数,任务运行时会调用此函数,注意也可声明成其它形式*/
15. void *(*process) (void *arg);
16. void *arg;/*回调函数的参数*/
17. struct worker *next;
18.
19. } CThread_worker;
20.
21.
22. /*线程池结构*/
23. typedef struct
24. {
25. pthread_mutex_t queue_lock;
26. pthread_cond_t queue_ready;
27.
28. /*链表结构,线程池中所有等待任务*/
29. CThread_worker *queue_head;
30.
31. /*是否销毁线程池*/
32. int shutdown;
33. pthread_t *threadid;
34. /*线程池中允许的活动线程数目*/
35. int max_thread_num;
36. /*当前等待队列的任务数目*/
37. int cur_queue_size;
38.
39. } CThread_pool;
40.
41.
42. int pool_add_worker (void *(*process) (void *arg), void *arg);
43. void *thread_routine (void *arg);
44.
45.
46. static CThread_pool *pool = NULL;
47. void
48. pool_init (int max_thread_num)
49. {
50. pool = (CThread_pool *) malloc (sizeof (CThread_pool));
51.
52. pthread_mutex_init (&(pool->queue_lock), NULL);//调用线程互斥初始化函数
53. pthread_cond_init (&(pool->queue_ready), NULL);//将线程处于准备状态
54.
55. pool->queue_head = NULL; //将线程池中的链表头置空
56.
57. pool->max_thread_num = max_thread_num;//将传过来的线程数量给线程池
中的pool->max_thread_num
58. pool->cur_queue_size = 0;//线程池中队列最大值设置为0
59.
60. pool->shutdown = 0;//线程池中关闭位0
61.
62. pool->threadid =
63. (pthread_t *) malloc (max_thread_num * sizeof (pthread_t));//为线程池线
程id分配内存
64. int i = 0;
65. for (i = 0; i < max_thread_num; i++)
66. {
67. pthread_create (&(pool->threadid[i]), NULL, thread_routine,
68. NULL);//创建max_thread_num个线程等待数
69. }
70. }
71.
72.
73. /*向线程池中加入任务*/
74. int pool_add_worker (void *(*process) (void *arg), void *arg)
75. {
76. /*构造一个新任务*/