版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程设计说明书20112012学年第一学期题目:信号量控制线程同步学 院: 计算机学院 专业班级: 学 号: 学生姓名: 指导教师: 成 绩: 时 间: 8:0010:00 2011年12月6日课程设计任务书 2010 2011 学年第 一 学期学生姓名: 专业班级: 指导教师: 工作部门: 计算机学院 一、课程设计题目 信号量控制线程同步二、课程设计内容该任务含两个程序的设计与编写,程序1同步两个线程,其一输出奇数,另一线程输出偶数,且二者交叉数据输出;程序2实现男女共用浴室的情况下的同步与互斥,男女到达浴室的时间数据放在文本文件。对于给定的输入文件,观察测试输出结果的正确性。三、进度安排(
2、1)1-2学时,选定题目、分析需求、理解需求;(2)3-4学时,程序设计,定义数据类型、数据处理方式;(3)5-10学时,编写程序、调试、测试;(4)11-12学时,编写设计报告;(5)13-16学时,答辩。四、基本要求(1)使用偏好的编程语言,源程序要有适当的注释,使程序容易阅读(2)学生可自动增加新功能模块(视情况可另外加分)。(3)写出课程设计报告,应不少于3000字(不含附录),同一组学生每人必须提交1份,报告中列明分工。 课程负责人签名: 年 月 日课程设计成绩评定表姓 名成绩评定权重总分总成绩(五分制)平时成绩20报告成绩50答辩成绩30信号量控制线程同步摘 要信号量控制线程同步算
3、法,主要设置两个线程,用一个或两个信号量分别控制线程,使得线程交替输出,资源临界区信号的控制利用,使用二个信号量,控制二线程其中之一输出一个数后,随后另一个线程也输出一个数,交替输出直至结束。以及实现:当有一个女生在浴室里,那么其他女生可以进入,但是男生不行,反之亦然。关键词: 线程同步 信号量 临界区目 录第一章设计内容1第二章总体设计22.1 设计任务22.2 设计调用图2第三章详细设计33.1 数据结构设计 33.2 流程图4第四章调试与测试54.1 调试过程中的主要问题54.2 测试结果5附录 8参考文献 17心得体会 181 设计内容 编写信号量控制线程同步的算法,实现以下功能:(1
4、) 两个线程,一者输出1-30的偶数,一者输出1-30的奇数(2) 使用一个信号量,控制二线程分别输出(即一个线程完成数据输出后,另一个线程方可开始数据输出。)(3) 使用二个信号量,控制二线程其中之一输出一个数后,随后另一个线程也输出一个数,交替输出直至结束。(4) 当有一个女生在浴室里,那么其他女生可以进入,但是男生不行,反之亦然。(5) 本系统是控制台应用程序,界面非常直观2 总体设计2.1设计任务: 用用一个信号量,两个线程控制奇偶数的交替输出以及两个线程控制先输出奇数再输出偶数的程序。男女共浴问题先要设置洗澡时间,男人和女人到达浴室的时间,还要读写文件,并且在文件中显示出最后的结果。
5、程序要设计得简单,可读性强,运行效率高,占用内存小,有一定的健壮性和良好的可维护性。 2.2 设计调用图主函数thread_1()thread_2()图2-1设计调用图1main()male()female()femalethread()malethread()return 0图2-2设计调用图23 详细设计3.1数据结构设计:这两个程序使用c#编写:程序1: using system;using system.collections.generic;using system.linq;using system.text;using system.threading;namespace con
6、soleapplication1;/命名空间private static void thread_1();/控制奇数输出的线程函数private static void thread_2();/控制偶数输出的线程函数程序2: using system;using system.collections.generic;using system.text;using system.threading;using system.io;namespace consoleapplication2;/命名空间public static void male(ref int data);/ public st
7、atic void female(ref int data);/ private static void malethread();/private static void femalethread()/3.2流程图: 信号量控制线程同步1图3.1 程序结构概览图创建奇数线程对象thrad1创建偶数线程对象thread2一个信号量控制两个线程同步结束信号量控制线程同步24 调试与测试4.1调试过程主要问题:我在测试本程序的时候最主要的问题就是在vc+6.0与vs2008之中对于条用系统的函数pow(2,k-i)的不一致,vs2008中老是提示函数调用不明确,导致遇到了一些问题,不过最终还是找到
8、的问题的所在,那就是double型和int行的隐式转换问题。还有对于文件存储问题是在不知道怎么去处理,又加上是在对并不怎么熟悉的伙伴系统之中,只好舍之(当然,是为了能够正确测试出程序的可运行性和直观性)。经过这次的课程设计,还是学会了编程不但需要头脑,还要很细心才行。4.2 测试结果 内存申请与回收后块的大小变化显示附 录/ mmc.cpp : defines the entry point for the console application./#include stdafx.h /* algo8-2.c 伙伴系统。实现算法8.2的程序 */ #includec1.h #includec8
9、-2.h #define n 100 /* 占用块个数的最大值 */ space r; /* r为生成空间的首地址,全局量 */ unsigned char *p; unsigned char gbuffer256*1024;/长度为0255的char类型 space allocbuddy(freelist avail,int n) /* avail0.m为可利用空间表,n为申请分配量,若有不小于n的空闲块,*/ /* 则分配相应的存储块,并返回其首地址;否则返回null。算法8.2 */ int i,k; space pa,pi,pre,suc; for(k=0;k=m&(availk.no
10、desizem) /* 分配失败,返回null */ return null; else /* 进行分配 */ pa=availk.first; /* pa指向可分配子表的第一个结点 */ pre=pa-llink; /* pre和suc分别指向pa所指结点的前驱和后继 */ suc=pa-rlink; if(pa=suc) /* 可分配子表只有1个结点 */ availk.first=null; /* 分配后该子表变成空表 */ else /* 从子表中删去pa所指结点(链表的第1个结点) */ pre-rlink=suc; suc-llink=pre; availk.first=suc;
11、/* 该子表的头指针指向pa所指结点的后继 */ for(i=1;availk-i.nodesize=n+1;+i) /* 从大到小将剩余块插入相应子表,约定将低地址(最前面)的块作为分配块 */ pi=pa+(int)pow(2,k-i); /* pi指向再分割的后半块(剩余块) */ pi-rlink=pi; /* pi是该链表的第1个结点,故左右指针都指向自身 */ pi-llink=pi; pi-tag=0; /* 块标志为空闲 */ pi-kval=k-i; /* 块大小 */ availk-i.first=pi; /* 插入链表 */ pa-tag=1; /* 最后剩给pa的是分配
12、块,令其块标志为占用 */ pa-kval=k-(-i); /* 块大小 */ return pa; /* 返回分配块的地址 */ space buddy(space p) /* 返回起始地址为p,块大小为pow(2,p-kval)的块的伙伴地址 */ if(p-r)%(int)pow(2,p-kval+1)=0) /* p为前块 */ return p+(int)pow(2,p-kval); /* 返回后块地址 */ else /* p为后块 */ return p-(int)pow(2,p-kval); /* 返回前块地址 */ void reclaim(freelist pav,spac
13、e *p) /* 伙伴系统的回收算法。将p所指的释放块回收到可利用空间表pav中 */ space s; s=buddy(*p); /* 伙伴块的起始地址 */ while(s=r&stag=0&s-kval=(*p)-kval) /* 归并伙伴块 */ /* ,伙伴块起始地址在有效范围内且伙伴块空闲并与p块等大,从链表上删除该伙伴块结点 */ if(s-rlink=s) /* 链表上仅此一个结点 */ pavs-kval.first=null; /* 置此链表为空 */ else /* 链表上不止一个结点 */ s-llink-rlink=s-rlink; /* 前驱的后继为该结点的后继 *
14、/ s-rlink-llink=s-llink; /* 后继的前驱为该结点的前驱 */ if(pavs-kval.first=s) /* s是链表的第一个结点 */ pavs-kval.first=s-rlink; /* 修改表头指向下一个结点 */ /* 以下修改结点头部 */ if(*p-r)%(int)pow(2,(*p)-kval+1)=0) /* p为前块 */ (*p)-kval+; /* 块大小加倍 */ else /* p为后块(s为前块) */ s-kval=(*p)-kval+1; /* 块大小加倍 */ *p=s; /* p指向新块首地址 */ s=buddy(*p);
15、/* 下一个伙伴块的起始地址 */ /* 以下将p插到可利用空间表中 */ (*p)-tag=0; /* 设块标志为空闲 */ if(pav(*p)-kval.first=null) /* 该链表空 */ pav(*p)-kval.first=(*p)-llink=(*p)-rlink=*p; /* 左右指针及表头都指向自身 */ else /* 该链表不空,插在表头 */ (*p)-rlink=pav(*p)-kval.first; (*p)-llink=(*p)-rlink-llink; (*p)-rlink-llink=*p; (*p)-llink-rlink=*p; pav(*p)-k
16、val.first=*p; *p=null; void print(freelist p) /* 输出p中所有可利用空间表 */ int i; space h; for(i=0;ikval),h); /* 输出结点信息 */ printf(块标志=%d(0:空闲 1:占用)n,h-tag); h=h-rlink; /* 指向下一个结点的头部域(首地址) */ while(h!=pi.first); /* 没到循环链表的表尾 */ void printuser(space p) /* 输出p数组所指的已分配空间 */ int i; for(i=0;ikval); printf( 块标志=%d(0
17、:空闲 1:占用)n,pi-tag); void main() int i,n; freelist a; space qn=null; /* q数组为占用块的首地址 */ printf(sizeof(byte_b)=%u m=%u (int)pow(2,m)=%un,sizeof(byte_b),m,(int)pow(2,m); for(i=0;illink=r-rlink=r; /* 初始化该结点 */ r-tag=0; r-kval=m; print(a); n=100; q0=allocbuddy(a,n); /* 向a申请100个byte_b的内存(实际获得128个byte_b) */
18、 memcpy(q0+2,aaaaaa,6); printf(%s,q0); printf(申请%d个字节后,可利用空间为:n,n); print(a); printuser(q); n=200; q1=allocbuddy(a,n); /* 向a申请200个byte_b的内存(实际获得256个byte_b) */ memcpy(q1+2,aaaaaa,6); printf(%s,q0); printf(申请%d个字节后,可利用空间为:n,n); print(a); printuser(q); n=220; q2=allocbuddy(a,n); /* 向a申请220个byte_b的内存(实际
19、获得256个byte_b) */ memcpy(q2+2,aaaaaa,6); printf(%s,q0); printf(申请%d个字节后,可利用空间为:n,n); print(a); printuser(q); reclaim(a,&q1); /* 回收q1,伙伴不空闲 */ printf(回收q1后,可利用空间为:n); print(a); printuser(q); reclaim(a,&q0); /* 回收q0,伙伴空闲 */ printf(回收q0后,可利用空间为:n); print(a); printuser(q); reclaim(a,&q2); /* 回收q2,伙伴空闲,生成一个大
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年大班信息世界说课稿
- 2025-2026学年不断充实的说课稿
- 种子繁育员岗前创新应用考核试卷含答案
- 抽纱刺绣工岗前操作安全考核试卷含答案
- 氧化铝制取工安全意识强化能力考核试卷含答案
- 集成电路管壳制造工操作技能强化考核试卷含答案
- 火炬系统操作工安全生产知识水平考核试卷含答案
- 2025-2026学年哥特式音乐说课稿
- 外延工成果竞赛考核试卷含答案
- 塑石工基础常识知识考核试卷含答案
- 2026-2027学年高三第一次联考(月考)试卷地理+答案
- T/CI 874-2025红树林精准生态修复与成效评估技术规程
- 湖南九校联盟2027届高三上学期第一次联考化学(含答案)
- 第12课 历史性成就 第1课时 课件(内嵌视频)2026-2027学年道德与法治五年级上册统编版
- 医疗机构麻醉药品和精神药品管理规定2026解读
- 2026秋教科版(新教材)小学科学六年级上册(全册)分层作业及答案附目录p149
- 2026年北京朝阳区高三二模语文试卷答案讲评课件
- 《思想道德与法治》课件-第一节 人生观是对人生的总的看法
- 盾构标准化施工手册
- 钢管脚手架租赁合同
- 欠款合同模板版
评论
0/150
提交评论