资源预览内容
第1页 / 共25页
第2页 / 共25页
第3页 / 共25页
第4页 / 共25页
第5页 / 共25页
第6页 / 共25页
第7页 / 共25页
第8页 / 共25页
第9页 / 共25页
第10页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
.开放性实验报告题 目: 基于ARM的多线程应用程序设计 院系名称: 电气工程学院 专业班级: 自动1302 学生姓名: 蒋贤坤 学 号: 201323020217 指导教师: 张晓东 成绩:指导老师签名: 日期:2017.1.6 资料.目 录1 系统概况12 完成步骤12.1 思路分析12.2 结构流程图22.3 重要函数32.3.1源程序32.3.2函数分析93 实验数据123.1下载和调试截图124 结果分析和总结12设计心得15参考文献16 资料.1 系统概况 生产者-消费者问题是一个经典的线程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。在同一个线程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。 多个生产/消费者在有界缓冲上操作。它利用N个字节的共享内存作为有界循环缓冲区,利用写一字符模拟放一个产品,利用读一字符模拟消费一个产品。当缓冲区空时消费者应阻塞睡眠,而当缓冲区满时生产者应当阻塞睡眠。一旦缓冲区中有空单元,生产者线程就向空单元中入写字符,并报告写的内容和位置。一旦缓冲区中有未读过的字符,消费者线程就从该单元中读出字符,并报告读取位置。生产者不能向同一单元中连续写两次以上相同的字符,消费者也不能从同一单元中连续读两次以上相同的字符。2 完成步骤2.1 思路分析 本试验是练习生产者-消费者问题,成性能分析,使理解掌握线程的同步、通信以及互斥和多线程的安全问题。 一般情况下,解决互斥方法常用信号量和互斥锁,即semaphore和mutex,而解决这个问题,多采用一个类似资源槽的结构,每个槽位标示了指向资源的指针以及该槽位的状态,生产者和消费者互斥查询资源槽,判断是否有产品或者有空位可以生产,然后进行相应的操作。同时,为了告诉生产者或者消费者资源槽的情况,还要有一个消息传送机制,无论是管道还是线程通信。 为了保证互斥要求,需要定义一个数据结构,这个数据结构包含两个指针,一个读一个写,同时有一个资源数目量,告诉生产者和消费者是否可以生产或者消费。由于该数据结构很小,因而可以对此结构互斥访问。同时,对于每组数据,都有一个标志位,表示此组数据是否被占用,生产者和消费者均可以先占用此位置然后完成相应的操作。 当消费者互斥访问此结构时,首先判断是否有数据可以取,如果没有,直接等待,若有数据可取,先更改标志位占用此数据,并将资源数目-1。然后交出互斥,把数据拷贝到自己缓冲区内,清空数据。当生产者访问时,首先判断有没有空位可以生产,如果没有,直接等待,若有数据可以生产,先判断该位是否被占用,如果没被占用,则占用此位置进行生产。生产完成后,将占用位改为未占用,同时将资源数目+1。2.2 结构流程图 试验为生产者-消费者问题模型的实现,主程序中分别启动生产者线程和消费者线程。生产者线程不断顺序地将0到9的数字写入共享的循环缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。试验流程图如下:图2-1 结构流程图2.3 重要函数2.3.1源程序试验代码:/*main.c*/#includeproducer.h#includecustomer.h#includedata.h#include#include/*实现生产者线程生产数据放入一个单向链表中,消费者线程负责消费数据*/intmain()pthread_tthread_pro;pthread_tthread_cons;printf(create.n);/创建生产者线程。pthread_create(&thread_pro,NULL,(void*)producer,NULL);/创建消费者线程。pthread_create(&thread_cons,NULL,(void*)customer,NULL);printf(finished!n);while(1)return0;/*data.h*/#ifndefDATA_H_#defineDATA_H_/单向链表数据结构structproductstructproduct*pre_product;charproduct_data20;structproduct*next_product;/向单向链表中加入一个节点(生产)。voidaddProduct(char*product_data);/从单向链表中取出全部节点信息(消费)。voidconsProduct();#endif/*data.c*/#includedata.h#include#include#includestruct product*present_product=NULL;structproduct*pre_product=NULL;intlock=0;voidaddProduct(char*product_data)while(lock=1);lock=1;structproduct*new_product=malloc(sizeof(structproduct);if(present_product=NULL)new_product-pre_product=NULL;strcpy(new_product-product_data,product_data);new_product-next_product=NULL;present_product=new_product;elsenew_product-pre_product=present_product;strcpy(new_product-product_data,product_data);new_product-next_product=NULL;present_product-next_product=new_product;present_product=new_product;lock=0;voidconsProduct()while(lock=1);lock=1;while(present_product!=NULL)pre_product=present_product-pre_product;printf(%sn,present_product-product_data);if(pre_product!=NULL)pre_product-next_product=0;free(present_product);present_product=pre_product;lock=0;/*producer.h*/#ifndefPRODUCER_H_#definePRODUCER_H_/生产者执行生产任务voidproducer();#endif/*producer.c*/#includeproducer.h#includedata.h#include#include#includeinttemp_i=0;voidproducer()chartemp20=0;while(1)sprintf(temp,number_%d,temp_i);addProduct(temp);temp_i+;usleep(int)(rand()/2000);/*customer.h*/#ifndefCUSTOMER_H_#defineCUSTOMER_H_/消费者执行消费任务。voidcustomer();#
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号