读写者实验报告_第1页
读写者实验报告_第2页
读写者实验报告_第3页
读写者实验报告_第4页
读写者实验报告_第5页
全文预览已结束

下载本文档

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

文档简介

《Linux系统分析》实验报告报告提交日期:姓名:程志超学号:128355003班级:交换生一、实验题目采用多线程互斥与同步机制,实现读者、写者问题二、实验目的掌握使用POSIX接口提供的互斥变量、条件变量实现多线程同步三、实验要求有一个文件为多个并发线程所共享,其中读线程只要求读取文件内容,写线程则要求修改文件容,允许多个线程同时读取文件内容。但若有一个写线程在写,则其他读线程不能读;若有一个写线程在写或有其他读线程在读,则其他写线程均被拒绝。当一个写线程正在写,而有多个读线程与写线程在等待时,写线程应优先唤醒。读线程进去读、等待,写线程进去写、等待等状态均在屏幕上打印出来四、设计思路和流程图(对于涉及算法的实验,需要提供数据结构及其说明、测试数据的设计及测试结果分析)数据结构的说明structprodcons{ intbuffer[BUFFERSIZE]; //缓冲区 pthread_mutex_tlock; //互斥锁 intreadpos,writepos; //读写的游标 pthread_cond_tnotempty; //缓冲区非空条件判断 pthread_cond_tnotfull; //缓冲区非满条件判断};测试结果:读和写的线程交互进行五、实验体会(包括实验中遇到的问题及解决过程、产生的错误及原因分析)对线程条件变量控制相关函数pthread_cond_init()、pthread_cond_wait()和pthread_cond_signal()的原型及用法不是很了解,上网查阅相关资料,明白第一个是初始化一个条件变量,第二个等待线程,尤其要注意线程状态和条件变量的加解锁过程是/*block-->unlock-->wait()return-->lock*/程序清单(包括源程序、makefile、readme)/***multithread.c***/#include<stdio.h>#include<pthread.h>#defineBUFFERSIZE100#defineOVER(-1)structprodcons{ intbuffer[BUFFERSIZE]; pthread_mutex_tlock; intreadpos,writepos; pthread_cond_tnotempty; pthread_cond_tnotfull;};voidinit(structprodcons*b){ pthread_mutex_init(&b->lock,NULL); pthread_cond_init(&b->notempty,NULL); pthread_cond_init(&b->notfull,NULL); b->readpos=0; b->writepos=0;}voidput(structprodcons*b,intdata){ pthread_mutex_lock(&b->lock); if((b->writepos+1)%BUFFERSIZE==b->readpos){ pthread_cond_wait(&b->notfull,&b->lock); } b->buffer[b->writepos]=data; b->writepos++; if(b->writepos>=BUFFERSIZE) b->writepos=0; pthread_cond_signal(&b->notempty); pthread_mutex_unlock(&b->lock);}intget(structprodcons*b){ intdata; pthread_mutex_lock(&b->lock); if(b->writepos==b->readpos){ pthread_cond_wait(&b->notempty,&b->lock); } data=b->buffer[b->readpos]; b->readpos++; if(b->readpos>=BUFFERSIZE) b->readpos=0; pthread_cond_signal(&b->notfull); pthread_mutex_unlock(&b->lock); returndata;}structprodconsbuffer;void*producer1(void*data){ intn; for(n=0;n<10000;n++){ //printf("%d\n",n); printf("producer1iswriting\n"); put(&buffer,n); } put(&buffer,OVER); returnNULL;}void*producer2(void*data){ intn; for(n=0;n<10000;n++){ //printf("%d\n",n); printf("producer2iswriting\n"); put(&buffer,n); } put(&buffer,OVER); returnNULL;}void*consumer1(void*data){ intd; while(1){ d=get(&buffer); if(d==OVER) break; //printf("%d\n",d); printf("consumer1isreading\n"); } returnNULL;}void*consumer2(void*data){ intd; while(1){ d=get(&buffer); if(d==OVER) break; //printf("%d\n",d); printf("consumer2isreading\n"); } returnNULL;}intmain(void){ pthread_twriter1,reader1,writer2,reader2; void*retval; init(&buffer); pthread_create(&writer1,NULL,producer1,0); pthread_create(&reader1,NULL,consumer1,0); pthread_create(&writer2,NULL,producer2,0); pthread_create(&reader2,NULL,c

温馨提示

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

评论

0/150

提交评论