线程池的使用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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. /*构造一个新任务*/

相关文档
最新文档