ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:207.33KB ,
资源ID:1976785      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/1976785.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统毕业课程设计报告网络121朱正杰.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统毕业课程设计报告网络121朱正杰.docx

1、操作系统毕业课程设计报告网络121朱正杰(此文档为word格式,下载后您可任意编辑修改!) 操作系统课程设计报告题目: 线程安全型双向链表的实现 专 业: 网络工程 班 级: 网络121 学 号: 姓 名: 朱正杰 上海海事大学信息工程学院2014年 12月 15日目录1.课程设计任务描述与要求 11.1任务描述 12.系统总体结构描述与主要数据结构说明 12.1系统总体结构描述 12.2主要数据结构说明 23.课程设计报告内容 53.1模块功能 53.2详细流程图 63.3实现思路说明 73.4程序清单 73.5注释 84.总结 19附录: 19程序使用说明 19程序测试思想 20程序测试结

2、果 20参考书目: 211.课程设计任务描述与要求1.1任务描述 编写一个线程安全的双向链表,所谓线程安全,就是该链表能够实现多个线程同时正确的增删改链表结点,也就是能够实现对链表这个临界资源的保护。1.2任务要求需要实现的函数包括:(1) InitList函数:初始化一个空的双向链表,并初始化各个用于保护链表的信号量。(2) Insert函数:向链表指定位置插入一个结点。(3) Erase函数:删除指定位置的结点。(4) Clear函数:删除链表中的所有结点。(5) Find函数:查找链表中是否有指定的元素,若有,返回能够访问该结点的指针;若无,返回NULL。(6) Print函数:打印当前

3、链表中的所有元素。完成该链表后,自己编写一个测试程序,生成多个线程同时读写该链表,验证链表执行是否正确,并给出测试报告。2.系统总体结构描述与主要数据结构说明2.1系统总体结构描述 系统总体结构设计的任务,是根据系统分析的逻辑模型设计应用软件系统的物理结构。系统物理模型必须符合逻辑模型,能够完成逻辑模型所规定的信息处理功能。这是物理设计的基本要求。 系统应具有可修改性,即易读,易于进行查错、改错、可以根据环境的变化和用户的要求进行各种的改变和改进。系统是否具有可修改性,对于系统开发和维护影响极大。据统计,在系统生命周期中各阶段的应用软件费用及人力投入大体分布如下:系统开发:20%;系统维护:8

4、0%。 由于程序功能简单,未用数据库辅助存储技术,本程序只供实现对双向链表的插入,删除,查找和打印等功能。2.2主要数据结构说明宏定义部分:#define random(x)(rand()%x) /产生随机数#define cr 1 /1标识为插入#define sc 0 /0标识为删除volatile int readcount=0; /读者数目const int lsarea=10000; /链表大小随机数const int earea=10000; /元素范围随机数const int sum=100000; /线程运行总次数int th=0; /初始化当前线程总数int th_cz=1;

5、 /初始化当前查找线程总数int th_cr=1; /初始化当前插入线程总数int th_sc=1; /初始化当前删除线程总数HANDLE h_Mutex; /控制读者数量readcount的互斥访问量HANDLE mutex; /控制读写互斥,写写互斥的信号量typedef int ElemType; / 定义ElemType为int类型的别名typedef struct DuLNode *PNode; /结点指针/定义结点结构体typedef struct DuLNode ElemType data; /定义数据域 PNode prior; /定义前驱指针 PNode next; /定义后

6、继指针DuLNode,*DLN;/定义双向链表结构体typedef struct DuLinkList DLN head; /定义头结点 int Length; /定义链表长度DuLinkList,*DLL;/定义读者传参结构体struct Readarg DLL List; /定义链表 ElemType e; /定义查找元素;/定义写者传参结构体struct Writearg DLL List; /定义链表 int add; /定义插入或删除的位置 ElemType e; /定义插入元素 int Flag; /定义传入标示符(cr执行插入操作,sc执行删除操作);线程函数部分:WaitFor

7、SingleObject(h_Mutex,-1);/等待互斥量信号WaitForSingleObject(mutex,INFINITE);/等待信号量信号ReleaseMutex(h_Mutex);/释放互斥量信号ReleaseSemaphore(mutex,1,NULL);/释放信号量信号主函数部分:HANDLE hThreadsum;/定义线程句柄unsigned threadIDsum;/定义sum个线程h_Mutex=CreateMutex(NULL,FALSE,NULL); /创建互斥量h_Mutexmutex=CreateSemaphore(NULL,1,1,NULL); /创建信

8、号量mutexReadarg *RA=new Readarg1;/创建读者传参变量RA0.List=L;/传参变量赋值RA0.e=random(100);/传参变量赋值Writearg *WA=new Writearg2;/创建写者传参变量WA0.List=L; /传参变量赋值WA0.add=random(lsarea); /传参变量赋值WA0.e=random(earea); /传参变量赋值WA0.Flag=cr; /传参变量赋值WA1.List=L; /传参变量赋值WA1.add=random(lsarea); /传参变量赋值WA1.e=0; /传参变量赋值WA1.Flag=sc; /传参

9、变量赋值hThreadi=(HANDLE)_beginthreadex(NULL,0,ReaderThread,(void*)&RA0,0,&threadIDi);/创建线程函数WaitForSingleObject(hThreadi,INFINITE);/等待线程执行完毕CloseHandle(hThreadi);/关闭线程句柄CloseHandle(h_Mutex);/关闭互斥量句柄CloseHandle(mutex);/关闭信号量句柄3.课程设计报告内容3.1模块功能 此程序包含6个模块,分别是初始化兼创建模块,插入模块,删除模块,清空模块,查找模块和打印模块。先是有进程自动初始化并随机

10、产生一个链表,然后创建多个线程,线程同时进行插入结点,删除指定位置结点,查找指定元素及打印链表操作,为清楚区分读和写的操作这里分出了两个线程一个为读者线程一个为写者线程,前者具有查找指定元素功能,后者具有插入和删除兼打印链表功能。对于所有的查找,插入和删除数都是随机产生的,更具有代表性。 如下图程序工作原理:图3.1 程序工作原理图3.2详细流程图图3.2系统流程图3.3实现思路说明第一步,构建双向链表的基本属性。包括结点结构体,链表结构体,初始化及创建链表函数,插入函数,删除函数,清空函数,查找函数,打印函数。第二步,创建三个线程分别进行插入、删除和查找操作,主函数内创建完链表后通过传参结构

11、体向线程传递链表参数,在线程内使用互斥量对链表的修改操作进行保护。运行过程中所有变量给定固定初始值,测试多线程同步的正确性。第三步,构建两个线程分别为读者线程(执行查找操作),写者线程(执行插入和删除操作),所有变量使用随机数定义,利用互斥量对读者数的修改操作进行保护,利用信号量对链表的修改操作进行保护,从而实现读读共享,读写互斥,写写互斥的读者写者问题。并测试读者优先状态下链表多线程操作的正确性。3.4程序清单#include/c语言标准输入输出头文件#include/动态存储分配函数头文件#include/标准库头文件(malloc(),rand(),srand()等等)#include/

12、包含用于和宏指令的作用声明与螺纹和过程一起使用的C标头文件(线程的创建和终结等等)#include/win32头文件#include/日期和时间头文件void InitList(DLL L)/初始化一个空的双向链表并创建链表void Insert(DLL L,int i,ElemType e) /在链表指定位置插入一个结点void Erase(DLL L,int i) /删除指定位置的结点void Clear(DLL L) /删除链表中所有结点DLN Find(DLL L,ElemType e) /查找链表中是否有指定的元素,若有,返回能够访问该结点的指针;若无,返回NULLvoid Prin

13、t(DLL L) /打印当前链表中的所有元素unsigned _stdcall ReaderThread(void *arg) /读者线程(查找)unsigned _stdcall WriterThread(void *arg) /写者线程(包括插入和删除)3.5注释 宏定义和主函数内部分代码的详细注释已经在前面章节阐述,下面主要为函数内容注释。/初始化一个空的双向链表并创建链表void InitList(DLL L) int c,i,e;/定义三个整型变量c,i,e DLN p;/定义结点p /初始化操作 L-head=0;/链表头结点置零 L-Length=0;/链表长度置零 /创建操作

14、printf(双向链表初始化完毕n); srand(int)time(0);/随机数时间种子设置 c=random(lsarea);/变量c取范围0Lsarea内的随机整数 if(!c) printf(链表创建失败!n); exit(0);/ 异常处理,如果用户未输入结点个数则跳出该段代码。 else p=(DuLNode*)malloc(sizeof(DuLNode); /p动态分配存储空间 if(!p) printf(结点p动态分配内存失败!n); exit(0); /异常处理,如果节点p动态分配内存失败则跳出该段代码。 e=random(earea);/变量e取范围0earea内的随机整数 p-data=e;/将变量e的值送入结点p的数据域 p-next=p-prior=p;/将结点p的前驱和后继指针指向它自己 L-head=p;/将p结点作为链表头结点 L-Length+;/链表长度加1 /下面循环插入后续结点操作 for(i=1;ic;i+) p=(DuLNode*)malloc(sizeof(DuLNode); /p动态分配存储空间 if(!p) printf(

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1