- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux下实现多线程的生产者消费者问题
Linux下实现多线程的生产者消费者问题
一、原理的理解
生产者-消费者问题是一个经典的线程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。在同一个线程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。semaphore和mutex,而解决这个问题,多采用一个类似资源槽的结构,每个槽位标示了指向资源的指针以及该槽位的状态,生产者和消费者互斥查询资源槽,判断是否有产品或者有空位可以生产,然后根据指针进行相应的操作。同时,为了告诉生产者或者消费者资源槽的情况,还要有一个消息传送机制,无论是管道还是线程通信。
然而,本次试验有几个特殊的要求:
A、循环缓冲。
B、除了stderr,stdout等外,只用小于2个的互斥锁、
C、放弃资源槽分配机制,采用额外的数据结构。
D、生产者一直持续生产,形成生产消费的良性循环。
首先,使用一个互斥锁,意味着资源槽机制就不能使用了。因为资源槽虽以用一个互斥锁完成,但是需要有额外的通信,如果使用管道通信,则管道也必须是互斥,这就不满足1个互斥锁的要求。其次,要求生产者一直生产,这就否定了另外一种方法:消费者、生产者的位置均平等,消费者消费的时候生产者不能生产,生产者生产的时候消费者不能消费。因此,就需要采用A要求,也就是循环链表的形式。
为了保证互斥要求,需要定义一个数据结构,这个数据结构包含两个指针,一个读一个写,同时有一个资源数目量,告诉生产者和消费者是否可以生产或者消费。由于该数据结构很小,因而可以对此结构互斥访问。同时,对于每组数据,都有一个标志位,表示此组数据是否被占用,生产者和消费者均可以先占用此位置然后完成相应的操作。
当消费者互斥访问此结构时,首先判断是否有数据可以取,如果没有,直接等待,若有数据可取,先更改标志位占用此数据,并将资源数目-1。然后交出互斥,把数据拷贝到自己缓冲区内,清空数据。当生产者访问时,首先判断有没有空位可以生产,如果没有,直接等待,若有数据可以生产,先判断该位是否被占用,如果没被占用,则占用此位置进行生产。生产完成后,将占用位改为未占用,同时将资源数目+1。这个过程可以如图所示:
2、重要函数和数据结构
(1)数据结构
#define N 5 // 生产者的数目
#define N2 15 // 消费者数目
#define M 20 // 缓冲数目
#define debug 0 //调试模式
#define nowait 1 //是否添加额外等待
pthread_mutex_t mutex; // 互斥信号量
int prod_id = 0; //生产者id
int proc_id = 0; //消费者id
//成功以及失败次数计数
int Succ[N+N2];
int Fail[N+N2];
//用于生产的填充数据
char dt[30]=aaaaaaaaaabbbbbbbbbbcccccccccc;
int toexit=0;//退出标记
//共用数据区
struct data_struc
{
int Occupied; //该位置是否被占用 无论生产还是消费
char d[1024]; //数据
struct data_struc* nx; //下一个指针
};
//互斥量
struct mtx
{
struct data_struc* rd_p;
struct data_struc* wr_p;
int cnt; //产品数量
};
struct mtx *mymutex; (2)函数说明
void printinfo();//调试函数,打印公用数据区的内容和状态
void Create_Empty_DS();//初始化循环链表
void *buy();//消费者
void *sell();//生产者
void *Recount();//数据统计,同时控制程序自动退出 3、程序流程图
A、主函数
B、统计线程
C、生产者线程
D、消费者线程
三、实验数据
1、程序运行截图
虚拟机:VMware Workstation7.0,win7;硬件:i3,2G DDR1333;编译:gcc product.c –pg –lpthread;报告生成:gprof –b。
运行时截图:
CPU占用情况(无额外等待):
2、原始数据
由于程序要求使用gprof进行分析,而在机器配置较好的情况下,使用gprof可能分析不出每个函数执
您可能关注的文档
- 0929Ad hoc网络两种按需路由协议性能仿真分析.doc
- 0803-第三节 均匀设计表的构造和运用.doc
- 09年三峡大学研究生入学考试机械原理试卷样本(A卷).doc
- 08级IP网络技术基础(英)试卷A-答案.doc
- 09级激光原理与技术期末考试试题B.doc
- 1-吕传柱---AED的应用和急救知识普及的立法.doc
- 066952RDCMU200各功能模块的设置及测试基本操作.doc
- 10-苯乙酮的制备.doc
- 10000 m3气柜施工方案.doc
- 1061552RD突破低功耗RF系统设计的瓶颈.doc
- 石家庄科技信息职业学院单招数学考试黑钻押题附完整答案详解【易错题】.docx
- 护理CQI申报表讲课件.pptx
- 2025-2030年中国隧道掘进机(TBM)市场发展战略规划及投资策略研究报告.docx
- 浙江乐丰年农业科技有限公司年产壹万吨藕粉及谷物类膨化系列代餐食品项目环评报告.docx
- 石家庄幼儿师范高等专科学校单招数学过关检测试卷及参考答案详解AB卷.docx
- 石家庄信息工程职业学院单招数学预测复习含完整答案详解(历年真题).docx
- 2025-2030年中国隧道掘进机(TBM)行业市场深度调研及投资战略研究报告.docx
- 石家庄信息工程职业学院单招数学测试卷附答案详解AB卷.docx
- 石家庄幼儿师范高等专科学校单招数学考试综合练习及答案详解【历年真题】.docx
- 石家庄工商职业学院单招数学考前冲刺测试卷含完整答案详解(全国通用).docx
文档评论(0)