基于ARM的多线程应用程序设计_第1页
基于ARM的多线程应用程序设计_第2页
基于ARM的多线程应用程序设计_第3页
基于ARM的多线程应用程序设计_第4页
基于ARM的多线程应用程序设计_第5页
已阅读5页,还剩13页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

开放性实验报告题 目: 基于 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参考文献 .1601 系统概况生产者-消费者问题是一个经典的线程同步问题,该问题最早由 Dijkstra 提出,用以演示他提出的信号量机制。在同一个线程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。多个生产/消费者在有界缓冲上操作。它利用 N 个字节的共享内存作为有界循环缓冲区,利用写一字符模拟放一个产品,利用读一字符模拟消费一个产品。当缓冲区空时消费者应阻塞睡眠,而当缓冲区满时生产者应当阻塞睡眠。一旦缓冲区中有空单元,生产者线程就向空单元中入写字符,并报告写的内容和位置。一旦缓冲区中有未读过的字符,消费者线程就从该单元中读出字符,并报告读取位置。生产者不能向同一单元中连续写两次以上相同的字符,消费者也不能从同一单元中连续读两次以上相同的字符。2 完成步骤2.1 思路分析本试验是练习生产者-消费者问题,成性能分析,使理解掌握线程的同步、通信以及互斥和多线程的安全问题。一般情况下,解决互斥方法常用信号量和互斥锁,即 semaphore 和 mutex,而解决这个问题,多采用一个类似资源槽的结构,每个槽位标示了指向资源的指针以及该槽位的状态,生产者和消费者互斥查询资源槽,判断是否有产品或者有空位可以生产,然后进行相应的操作。同时,为了告诉生产者或者消费者资源槽的情况,还要有一个消息传送机制,无论是管道还是线程通信。为了保证互斥要求,需要定义一个数据结构,这个数据结构包含两个指针,一个读一个写,同时有一个资源数目量,告诉生产者和消费者是否可以生产或者消费。由于该数据结构很小,因而可以对此结构互斥访问。同时,对于每组数据,都有一1个标志位,表示此组数据是否被占用,生产者和消费者均可以先占用此位置然后完成相应的操作。当消费者互斥访问此结构时,首先判断是否有数据可以取,如果没有,直接等待,若有数据可取,先更改标志位占用此数据,并将资源数目-1。然后交出互斥,把数据拷贝到自己缓冲区内,清空数据。当生产者访问时,首先判断有没有空位可以生产,如果没有,直接等待,若有数据可以生产,先判断该位是否被占用,如果没被占用,则占用此位置进行生产。生产完成后,将占用位改为未占用,同时将资源数目+1 。2.2 结构流程图试验为生产者-消费者问题模型的实现,主程序中分别启动生产者线程和消费者线程。生产者线程不断顺序地将 0 到 9 的数字写入共享的循环缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。试验流程图如下:初始化结构体p t h r e a d 中的各个参数建立生产者 、 消费者线程等待线程结束退出N = 0N #include /* *实现生产者线程生产数据放入一个单向链表中,消费者线程负责消费数据*/ int main() pthread_t thread_pro; pthread_t thread_cons; printf(“create.n“); /创建生产者线程。 pthread_create( /创建消费者线程。 pthread_create( printf(“finished!n“); while(1) return 0; /*data.h*/ #ifndef DATA_H_ #define DATA_H_ /单向链表数据结构 3struct product struct product *pre_product; char product_data20; struct product *next_product; ; /向单向链表中加入一个节点(生产)。 void addProduct(char *product_data); /从单向链表中取出全部节点信息(消费)。 void consProduct(); #endif /*data.c*/ #include “data.h“ #include #include #include struct product *present_product=NULL; struct product *pre_product = NULL; int lock=0; void addProduct(char *product_data) while(lock=1); lock=1; struct product *new_product=malloc(sizeof(struct product); 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; else new_product-pre_product=present_product; strcpy( new_product-product_data,product_data); 4new_product-next_product=NULL; present_product-next_product=new_product; present_product=new_product; lock=0; void consProduct() 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*/ #ifndef PRODUCER_H_ #define PRODUCER_H_ /生产者执行生产任务 void producer(); #endif /*producer.c*/ #include “producer.h“ #include “data.h“ #include 5#include #include int temp_i=0; void producer() char temp20=0; while(1) sprintf(temp,“number_%d“,temp_i); addProduct(temp); temp_i+; usleep(int)(rand()/2000); /*customer.h*/ #ifndef CUSTOMER_H_ #define CUSTOMER_H_ /消费者执行消费任务。 void customer(); #endif /*customer.c*/ #include “customer.h“ #include “data.h“ #include #include void customer() while(1) consProduct(); printf(“-n“); usleep(int)(rand()/1000); 6int main(int argc, char *argv) pthread_t producer_id;pthread_t consumer_id; pthread_create( void *producer(void *arg) pthread_detach(pthread_self(); while(1) pthread_mutex_lock( if (size = MALE_LENGTH) printf(“person:buff is full(producer)n“); producer_wait = 1; pthread_cond_wait( producer_wait = 0; rear = (rear + 1) % MALE_LENGTH; buffrear = rand() % MALE_LENGTH; printf(“producer: %d: %dn“, rear, buffrear); +size; if (size = 1) while (1) if (consumer_wait) pthread_cond_signal( break; pthread_mutex_unlock( 7pthread_create( void *consumer(void *arg) pthread_detach(pthread_self(); while(1) pthread_mutex_lock( if(size = 0) printf(“person:buff is empty(consumer)n“); consumer_wait = 1; pthread_cond_wait( consumer_wait =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论