1 / 18
文档名称:

linux多线程实验报告.doc

格式:doc   大小:416KB   页数:18页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

linux多线程实验报告.doc

上传人:iris028 2020/7/1 文件大小:416 KB

下载得到文件列表

linux多线程实验报告.doc

文档介绍

文档介绍:实验八Linux多线程实验报告撰写人专业班级学号姓名完成时间。。。。。。。。。。。实验目的了解什么是多线程,熟悉LINUX的多线程机制;掌握利用信号处理Linux多线程的同步问题;掌握利用信号量处理Linux多线程的互斥问题;运用Linux多线程的同步机制和互斥机制实现生产者消费者的编程。实验内容“生产者-消费者”问题如下:有一个有限缓冲区和两个线程:生产者和消费者。他们分别不停地把产品放入缓冲区、从缓冲区中拿走产品。一个生产者在缓冲区满的时候必须等待,一个消费者在缓冲区空的时候也必须等待。另外,因为缓冲区是临界资源,所以生产者和消费者之间必须互斥执行。它们之间的关系如图1所示。现在要求使用共享内存来模拟有限缓冲区,并且使用信号量来解决“生产者-消费者”问题中的同步和互斥问题。:假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。请用Linux线程编程解决。2哲学家进餐问题示意图实验过程与结果操作过程错误解决方法实验1步骤一:,在这里最好不要使用for(inti=0;;)最好在外声明inti在for循环里直接写i=0步骤二:编译代码并且运行代码步骤三:运行完毕后,显示以下代码:生产者消费者先后生产数据以及取出数据,此程序中设置了两个消费者两个生产者,交替进行生产数据消费数据。实验步骤一::编译代码并且运行代码步骤三:实验代码实验一:#include<>#include<>#include<>#include<>#include<sys/>#include<sys/>#include<sys/>#include<sys/>#defineMAX_BUFFER_SIZE10#defineSHM_MODE0600#defineSEM_MODE0600#defineSEM_FULL0#defineSEM_EMPTY1#defineMUTEX2/*#ifdefined(__GNU_LIBRARY__)&&!defined(_SEM_SEMUN_UNDEFINED)// unionsemunisdefinedbyincluding<sys/>#else//accordingtoX/OPENwehavetodefineitourselvesunionsemun{intval;structsemid_ds*buf;unsignedshort*array;};#endifunionsemunsu;//semunion,用于初始化信号量*/structmy_buffer{ inthead; inttail; charstr[MAX_BUFFER_SIZE]; intnum;//缓冲区里字母数量 intis_empty;};constintN_CONSUMER=2;//消费者数量constintN_PRODUCER=2;//生产者数量constintN_BUFFER=10;//缓冲区容量constintN_WORKTIME=10;//工作次数intshm_id=-1;intsem_id=-1;pid_tchild;pid_tparent;//得到10以内的一个随机数intget_random(){ intdigit; srand((unsigned)(getpid()+time(NULL))); digit=rand()%10; returndigit;}//得到A~Z的一个随机字母chargetRandChar(){ charletter; srand((unsigned)(getpid()+time(NULL))); letter=(char)((rand()%26)+'A'); returnletter;}//sem_id表示信号量集合的id//sem_num表示要处理的信号量在信号量集合中的索引//P操作voidwaitSem(intsem_id,intsem_num){ structsembufsb; =sem_num; =-1;//表示要把信号量减一 =SEM_UNDO;////第二个参数是sembuf[]类型的,表示数组//第三个参数表示第二个参数代表的数组的大小 if(s