生产者消费者编程-线程池+信号量.doc

  1. 1、本文档共48页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
生产者消费者编程-线程池信号量

生产者消费者编程实现,采用了线程池以及信号量技术。 线程的概念就不多说,首先说一下多线程的好处:多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 ? 那么为什么又需要线程池呢? ? 我们知道应用程序创建一个对象,然后销毁对象是很耗费资源的。创建线程,销毁线程,也是如此。因此,我们就预先生成一些线程,等到我们使用的时候在进行调度,于是,一些池化资源技术就这样的产生了。 一般一个简单线程池至少包含下列组成部分。 1)????????线程池管理器(ThreadPoolManager):用于创建并管理线程池 2)????????工作线程(WorkThread):?线程池中线程 3)????????任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。 4)????????任务队列:用于存放没有处理的任务。提供一种缓冲机制。 图示: 图1 线程池图解 生产者消费者模型C语言代码实现: thread_pool_pv.h: [cpp]?view plaincopyprint? //线程池编程实现?? #ifndef?THREAD_POOL_H?? #define?THREAD_POOL_H?? ?? #include?stdio.h?? #include?stdlib.h?? #include?semaphore.h//信号量sem_t?? #include?pthread.h?? ?? ?? //任务接口,线程调用的函数?? typedef?void*?(*FUNC)(void?*arg);?? ?? //任务数据结构?? typedef?struct?thread_pool_job_s{?? ????????FUNC?function;//线程调用的函数?? ????????void?*arg;//函数参数?? ????????struct?thread_pool_job_s?*pre;//指向上一个节点?? ????????struct?thread_pool_job_s?*next;//指向下一个节点?? }thread_pool_job;?? ?? //工作队列?? typedef?struct?thread_pool_job_queue_s{?? ????????thread_pool_job?*head;//队列头指针?? ????????thread_pool_job?*tail;//队列尾指针?? ????????int?num;//任务数目?? ????????sem_t?*quene_sem;//信号量?? }thread_pool_job_queue;?? ?? //线程池(存放消费者进程)?? typedef?struct?thread_pool_s{?? ????????pthread_t?*threads;//线程?? ????????int?threads_num;//线程数目?? ????????thread_pool_job_queue?*job_queue;//指向工作队列的指针?? }thread_pool;?? ?? //typedef?struct?thread_data_s{?? //??????pthread_mutex_t?*mutex_t;//互斥量?? //??????thread_pool?*tp_p;//指向线程池的指针?? //}thread_data;?? ?? //初始化线程池?? thread_pool*?tp_init(int?thread_num);?? ?? //初始化工作队列?? int?tp_job_quene_init(thread_pool?*tp);?? ?? //向工作队列中添加一个元素?? void?tp_job_quene_add(thread_pool?*tp,thread_pool_job?*new_job);?? ?? //向线程池中添加一个工作项?? int?tp_add_work(thread_pool?*tp,void?*(*func_p)(void?*),void?*arg);?? ?? //取得工作队列的最后个节点?? thread_pool_job*?tp_get_lastjob(thread_pool?*tp);?? ?? //删除工作队列的最后个节点?? int?tp_delete__lastjob(thread_pool?*tp);?? ?? //销毁线程池?? void?tp_destroy(thread_pool?*tp);?? ?? //消费者线程函数?? void*?tp_thread_func(thread_pool?*tp);??

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档