《操作系统》课程设计-进程通信与进程同步机制实现_第1页
《操作系统》课程设计-进程通信与进程同步机制实现_第2页
《操作系统》课程设计-进程通信与进程同步机制实现_第3页
《操作系统》课程设计-进程通信与进程同步机制实现_第4页
《操作系统》课程设计-进程通信与进程同步机制实现_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、江苏大学操作系统课程设计说明书设计题目 进程通信与进程同步机制实现 学生姓名 卢江涛 指导老师 薛安荣 学 院 计算机学院 专业班级 软件工程1002班 学号 完成时间 2013年1月9日 一 课程设计题目某银行提供10个服务窗口(7个对私服务窗口,3个对公服务窗口)和100个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用,有对公和对私两类号,美味顾客只能选取其中一个。当营业员空闲时,通过叫号选取一位顾客,并为其服务。请用P、V操作写出进程的同步算法。二 课程设计目的1、掌握基本的同步与互斥算法,理解银行排队系统操作模型。 2、学习

2、使用Windows 2000/XP中基本的同步对象,掌握相关API的使用方法。 3、了解Windows 2000/XP中多线程的并发执行机制,实现进程的同步与互斥。三课程设计要求学习并理解生产者/消费者模型及其同步/互斥规则; 学习了解Windows同步对象及其特性; 熟悉实验环境,掌握相关API的使用方法; 设计程序,实现生产者/消费者进程(线程)的同步与互斥; 提交实验报告。四需要了解的知识1.同步对象同步对象是指Windows中用于实现同步与互斥的实体,包括信号量(Semaphore)、互斥量(Mutex)、临界区(Critical Section)和事件(Events)等。本实验中使用

3、到信号量、互斥量和临界区三个同步对象。 2.同步对象的使用步骤:创建/初始化同步对象。请求同步对象,进入临界区(互斥量上锁)。释放同步对象(互斥量解锁)。五需要用到的API函数及相关函数我们利用Windows SDK提供的API编程实现实验题目要求,而VC中包含有Windows SDK的所有工具和定义。要使用这些API,需要包含堆这些函数进行说明的SDK头文件最常见的是Windows.h(特殊的API调用还需要包含其他头文件)。本实验使用到的API的功能和使用方法简单介绍 1、WaitForSingleObject( hSemaphoreChairs , INFINITE );WaitForS

4、ingleObject( hMutex , INFINITE );l 功能使程序处于等待状态,直到信号量hHandle出现(即其值大于等于1)或超过规定的等待时间l 格式DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);l 参数说明hHandle信号量指针。dwMilliseconds等待的最长时间(INFINITE为无限等待)。 2、ReleaseMutex( hMutex );l 功能打开互斥锁,即把互斥量加1。成功调用则返回0l 格式BOOL ReleaseMutex(HANDLE hMutex);Releas

5、eSemaphore( hSemaphoreShoppers ,1,NULL);l 功能对指定信号量加上一个指定大小的量。成功执行则返回非0值l 格式BOOL ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LPLONG lppreviousCount );l 参数说明hSemaphore信号量指针。lReleaseCount信号量的增量。lppreviousCount保存信号量当前值。 3、hShoppersThread = CreateThread ( NULL ,0 , fnTreadFunction ,NULL , 0 ,NU

6、LL ); CreateThreadl 功能创建一个在调用进程的地址空间中执行的线程l 格式HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParamiter,DWORD dwCreationFlags,Lpdword lpThread );l 参数说明lpThreadAttributes指向一个LPSECURITY_ATTRIBUTES(新线程的安全性描述符)。dwStackSize定义原

7、始堆栈大小。lpStartAddress指向使用LPTHRAED_START_ROUTINE类型定义的函数。lpParamiter定义一个给进程传递参数的指针。dwCreationFlags定义控制线程创建的附加标志。lpThread保存线程标志符(32位)4、hMutex = CreateMutex ( NULL , FALSE , NULL ); hMutexBarber = CreateMutex ( NULL , FALSE , NULL );l 功能创建一个命名或匿名的互斥量对象l 格式HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexA

8、ttributes,BOOL bInitialOwner,LPCTSTR lpName); 5. hSemaphoreChairs = CreateSemaphore ( NULL ,dwWaitVolume , dwWaitVolume , NULL ); hSemaphoreShoppers = CreateSemaphore ( NULL ,0 , dwWaitVolume , NULL );l 功能创建一个命名或匿名的信号量对象l 格式HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lIn

9、itialCount, LONG lMaximumCount, LPCTSTR lpName );l 参数说明lpSemaphoreAttributes必须取值NULL。lInitialCount信号量的初始值。该值大于0,但小于lMaximumCount指定的最大值。lMaximumCount信号量的最大值。lpName信号量名称。 hBarberThread = CreateThread ( NULL ,0 , fnBarberFunction ,NULL , 0 ,NULL );l 功能创建一个在调用进程的地址空间中执行的线程l 格式HANDLE CreateThread( LPSECU

10、RITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParamiter,DWORD dwCreationFlags,Lpdword lpThread );l 参数说明lpThreadAttributes指向一个LPSECURITY_ATTRIBUTES(新线程的安全性描述符)。dwStackSize定义原始堆栈大小。lpStartAddress指向使用LPTHRAED_START_ROUTINE类型定义的函数。lpParamiter定义一个给进程传

11、递参数的指针。dwCreationFlags定义控制线程创建的附加标志。lpThread保存线程标志符(32位)六原理及算法1、信号量设置hMutex:取号机互斥信号量 hSemaphorePubCus:等待对公服务顾客的数量hSemaphorePriCus:等待对私服务顾客的数量hSemaphoreSeats:剩余空座位的数量 2、线程创建fnPubser1,fnPubser2,fnPubser3:3个对公窗口线程fnPriser1,fnPriser2,fnPriser3,fnPriser4,fnPriser5,fnPriser6,fnPriser7:7个对私窗口线程fnPubTreadFu

12、nction:对公顾客线程fnPriTreadFunction:对私顾客线程seat :可用座位数量 Pubcus=0:初始对公顾客等待数量Pricus=0:初始对私顾客等待数量dwCustoms=0:初始顾客排队数量 3、P、V操作semaphore hMutex,hSemaphorePubCus,hSemaphorePriCus,hSemaphoreSeats;int seat,Pubcus=0,Pricus=0,dwCustoms=0;hMutex.value=1;hSemaphorePubCus.value=0;hSemaphorePriCus.value=0;hSemaphoreSe

13、ats.value=seat;process A/顾客线程 int i=0; p(&hSemaphoreSeats); p(&hMutex); 在取号机上取号; int set=rand()%2; Switch(set)case 0:创建对公顾客线程; dwCustoms+;default: 创建对私顾客线程;dwCustoms+; v(&mutex);等待叫号;接受服务; v(&hSemaphorePubCus); /当取到对私服务号时为v(&hSemaphorePriCus);process B/窗口线程,分对公窗口与对私窗口,执行过程相似,在此只写出其中一个窗口线程 P(&hSemaph

14、orePubCus);/当取到对私服务号是为p(&hSemaphorePriCus); 若有顾客等待,则通过叫号为下一位顾客服务; dwCustoms-; v(&hSemaphoreSeats); 为顾客提供服务 顾客离开;七算法流程图开始客户到达选择服务窗口服务并离开窗口闲置窗口忙?队列空?时间到?处理并离开队头取客户排队结束八主要数据结构及实现通过创建十二个线程来实现银行排队系统,3个对公窗口,7个对私窗口,1个对公等待顾客,1个对私等待顾客,十个窗口建立之后,来顾客就执行,没顾客就挂起,进入等待状态,通过设计一个随机数来实现对公对私窗口的区分,服务时间可以通过设计一个随机时间来实现,四个

15、信号量,其中一个互斥信号量是取号机的,因为取号机只能一个人用,其余三个分别是等待室的信号量,对公和对私服务信号量,进来一个人时,先检查座位是否满了,没满,则取号,进入等待室,然后等待窗口叫号,当服务完时,离开并释放一个座位。顾客线程创建过程:(顾客线程分对公顾客线程与对私顾客线程,创建过程基本类似,下面列举对公顾客线程创建过程)DWORD WINAPI fnPriTreadFunction(LPVOID lpParameter)/*进入等待室PV操作*/ WaitForSingleObject( hSemaphoreSeats , INFINITE );/检查等待室有没有空位,有则继续 Wai

16、tForSingleObject( hMutex , INFINITE );/进入等待室,同时不允许其他顾客进入PrivateCustomers+;coutn第PrivateCustomers位对私顾客进入!n;ReleaseMutex( hMutex );ReleaseSemaphore( hSemaphorePrivateCustomers,1,NULL);/释放一个信号量使顾客可以接受服务return 0 ;窗口线程创建过程:(窗口线程分3个对公窗口与7个对私窗口,创建过程基本类似,下面列举对公窗口1线程创建过程)DWORD WINAPI PublicSevice2(LPVOID lpP

17、arameter) while(1) if (PublicCustomers = 2)cout对公窗口2空闲!n;/*开始对公服务PV操作*/WaitForSingleObject( hSemaphorePublicCustomers , INFINITE );/检查有没有顾客等待服务,有则继续WaitForSingleObject( hMutex , INFINITE );/进入等待室时不允许其他顾客进入WaitForSingleObject(PublicSevice2 , INFINITE );/开始服务ReleaseMutex( hMutex );/释放互斥量,室其他人可以进入Relea

18、seSemaphore( hSemaphoreSeats ,1,NULL);/释放信号量使其它顾客可以进入等待室cout第PublicCustomers位对公顾客正在服务!n;/窗口正在服务,服务延时cout第PublicCustomers位对公顾客离开!n;WaitCustoms-;/记录顾客离开的序号ReleaseMutex( hSemaphoreSeats );/释放信号量使其它顾客可以到达窗口接受服务CloseHandle(PublicSevice2); 九实验测试结果及结果分析结果分析顾客进入银行之后,首先判断是否有空座位,若有,则在取号机上取号,等待窗口服务。对于窗口而言,只要其空

19、闲,则按照顾客取号的顺序为顾客提供服务。所有线程执行结束之后程序结束。十课程设计总结通过此次课程设计,对银行排队系统有了较为透彻的了解,同时也了解到了c+中许多api功能函数的运用,觉得c+真的是包含了好多好多功能,以前就以为只需要学会书上的东西就行,现在发现其实不然,好多东西都是我们从实践中学习到的,好多库函数自己根本就不知道,感觉这次真的学到了好多,不仅仅是把银行排队系统理解了,更重要的是巩固了以前的知识,学到了新的东西。回顾此次课程设计,自从拿到题目到完成整个编程,从理论到实践,我们学到很多的知识,不仅巩固了以前所学的知识,而且学到很多课外的知识,通过本次设计,让我们懂得了理论与实际相结

20、合的重要性,只有把所学的理论知识与实践相结合,才能真正提高自己的实际动手能力和独立思考的能力。总之,此次课程设计给我们提供了一个既动手又动脑、自学、独立实践的机会,是我们养成自学的好习惯,锻炼了实际分析问题和解决问题的能力,提高了适应实际编写的能力,为今后的学习和实践打下良好的基础。十一.源程序清单主要代码#include #include #include #include #include #include using namespace std;DWORD seat , PublicCustomers = 0,PrivateCustomers= 0,WaitCustoms=0;/分别设定

21、座位的初始值,对公对私顾客窗口的初始值,等待顾客的初始值HANDLE hMutex ,hSemaphorePublicCustomers, hSemaphorePrivateCustomers , hSemaphoreSeats ;/分别设定取号机的互斥量,等待对公服务顾客的数量,等待对私服务顾客的数量和等待室剩余座位数的信号量DWORD WINAPI fnPubTreadFunction(LPVOID lpParameter)/*进入等待室PV操作*/ WaitForSingleObject( hSemaphoreSeats , INFINITE );/检查等待室有没有空位,有则继续 Wai

22、tForSingleObject( hMutex , INFINITE );/进入等待室,同时不允许其他顾客进入PublicCustomers+;coutn第PublicCustomers位对公顾客进入!n;ReleaseMutex( hMutex );/创建对公服务窗口线程ReleaseSemaphore( hSemaphorePublicCustomers,1,NULL);return 0;DWORD WINAPI fnPriTreadFunction(LPVOID lpParameter)/*进入等待室PV操作*/ WaitForSingleObject( hSemaphoreSeats

23、 , INFINITE );/检查等待室有没有空位,有则继续 WaitForSingleObject( hMutex , INFINITE );/进入等待室,同时不允许其他顾客进入PrivateCustomers+;coutn第PrivateCustomers位对私顾客进入!n;ReleaseMutex( hMutex );ReleaseSemaphore( hSemaphorePrivateCustomers,1,NULL);/释放一个信号量使顾客可以接受服务return 0 ;DWORD WINAPI PublicSevice1(LPVOID lpParameter) while(1) i

24、f (PublicCustomers = 1)cout对公窗口1空闲!n;/*开始对公服务PV操作*/WaitForSingleObject( hSemaphorePublicCustomers , INFINITE );/检查有没有顾客等待服务,有则继续WaitForSingleObject( hMutex , INFINITE );/进入等待室时不允许其他顾客进入WaitForSingleObject(PublicSevice1 , INFINITE );/开始服务ReleaseMutex( hMutex );/释放互斥量,室其他人可以进入ReleaseSemaphore( hSemaph

25、oreSeats ,1,NULL);/释放信号量使其它顾客可以进入等待室cout第PublicCustomers位对公顾客正在服务!n;/窗口正在服务,服务延时cout第PublicCustomers位对公顾客离开!n;WaitCustoms-;/记录顾客离开的序号ReleaseMutex( hSemaphoreSeats );/释放信号量使其它顾客可以到达窗口接受服务CloseHandle(PublicSevice1); DWORD WINAPI PublicSevice2(LPVOID lpParameter) while(1) if (PublicCustomers = 2)cout对公

26、窗口2空闲!n;/*开始对公服务PV操作*/WaitForSingleObject( hSemaphorePublicCustomers , INFINITE );/检查有没有顾客等待服务,有则继续WaitForSingleObject( hMutex , INFINITE );/进入等待室时不允许其他顾客进入WaitForSingleObject(PublicSevice2 , INFINITE );/开始服务ReleaseMutex( hMutex );/释放互斥量,室其他人可以进入ReleaseSemaphore( hSemaphoreSeats ,1,NULL);/释放信号量使其它顾客

27、可以进入等待室cout第PublicCustomers位对公顾客正在服务!n;/窗口正在服务,服务延时cout第PublicCustomers位对公顾客离开!n;WaitCustoms-;/记录顾客离开的序号ReleaseMutex( hSemaphoreSeats );/释放信号量使其它顾客可以到达窗口接受服务CloseHandle(PublicSevice2); DWORD WINAPI PublicSevice3(LPVOID lpParameter) while(1) if (PublicCustomers = 3)cout对公窗口3空闲!n;/*开始对公服务PV操作*/WaitFor

28、SingleObject( hSemaphorePublicCustomers , INFINITE );/检查有没有顾客等待服务,有则继续WaitForSingleObject( hMutex , INFINITE );/进入等待室时不允许其他顾客进入WaitForSingleObject(PublicSevice3 , INFINITE );/开始服务ReleaseMutex( hMutex );/释放互斥量,室其他人可以进入ReleaseSemaphore( hSemaphoreSeats ,1,NULL);/释放信号量使其它顾客可以进入等待室cout第PublicCustomers位对

29、公顾客正在服务!n;/窗口正在服务,服务延时cout第PublicCustomers位对公顾客离开!n;WaitCustoms-;/记录顾客离开的序号ReleaseMutex( hSemaphoreSeats );/释放信号量使其它顾客可以到达窗口接受服务CloseHandle(PublicSevice3); DWORD WINAPI PrivateSevice1(LPVOID lpParameter) while(1) if (PrivateCustomers = 1)cout对私窗口1空闲!n;/*开始对私服务PV操作*/WaitForSingleObject( hSemaphorePri

30、vateCustomers , INFINITE );/检查有没有顾客等待服务,有则继续WaitForSingleObject( hMutex , INFINITE );/进入等待室时不允许其他顾客进入WaitForSingleObject(PrivateSevice1 , INFINITE );/开始服务ReleaseMutex( hMutex );/释放互斥量,使其他人可以进入ReleaseSemaphore( hSemaphoreSeats ,1,NULL);/释放信号量使其它顾客可以进入等待室cout第PrivateCustomers位对私顾客正在服务!n;/窗口正在服务,服务延时co

31、ut第PrivateCustomers位对私顾客离开!n;WaitCustoms-;/记录顾客离开的序号ReleaseMutex( hSemaphoreSeats );/释放信号量使其它顾客可以到达窗口接受服务CloseHandle(PrivateSevice1); DWORD WINAPI PrivateSevice2(LPVOID lpParameter) while(1) if (PrivateCustomers = 2)cout对私窗口2空闲!n;/*开始对私服务PV操作*/WaitForSingleObject( hSemaphorePrivateCustomers , INFINI

32、TE );/检查有没有顾客等待服务,有则继续WaitForSingleObject( hMutex , INFINITE );/进入等待室时不允许其他顾客进入WaitForSingleObject(PrivateSevice2 , INFINITE );/开始服务ReleaseMutex( hMutex );/释放互斥量,使其他人可以进入ReleaseSemaphore( hSemaphoreSeats ,1,NULL);/释放信号量使其它顾客可以进入等待室cout第PrivateCustomers位对私顾客正在服务!n;/窗口正在服务,服务延时cout第PrivateCustomers位对私

33、顾客离开!n;WaitCustoms-;/记录顾客离开的序号ReleaseMutex( hSemaphoreSeats );/释放信号量使其它顾客可以到达窗口接受服务CloseHandle(PrivateSevice2); DWORD WINAPI PrivateSevice3(LPVOID lpParameter) while(1) if (PrivateCustomers = 3)cout对私窗口3空闲!n;/*开始对私服务PV操作*/WaitForSingleObject( hSemaphorePrivateCustomers , INFINITE );/检查有没有顾客等待服务,有则继续

34、WaitForSingleObject( hMutex , INFINITE );/进入等待室时不允许其他顾客进入WaitForSingleObject(PrivateSevice3 , INFINITE );/开始服务ReleaseMutex( hMutex );/释放互斥量,使其他人可以进入ReleaseSemaphore( hSemaphoreSeats ,1,NULL);/释放信号量使其它顾客可以进入等待室cout第PrivateCustomers位对私顾客正在服务!n;/窗口正在服务,服务延时cout第PrivateCustomers位对私顾客离开!n;WaitCustoms-;/记

35、录顾客离开的序号ReleaseMutex( hSemaphoreSeats );/释放信号量使其它顾客可以到达窗口接受服务CloseHandle(PrivateSevice3); DWORD WINAPI PrivateSevice4(LPVOID lpParameter) while(1) if (PrivateCustomers = 4)cout对私窗口4空闲!n;/*开始对私服务PV操作*/WaitForSingleObject( hSemaphorePrivateCustomers , INFINITE );/检查有没有顾客等待服务,有则继续WaitForSingleObject( h

36、Mutex , INFINITE );/进入等待室时不允许其他顾客进入WaitForSingleObject(PrivateSevice4 , INFINITE );/开始服务ReleaseMutex( hMutex );/释放互斥量,使其他人可以进入ReleaseSemaphore( hSemaphoreSeats ,1,NULL);/释放信号量使其它顾客可以进入等待室cout第PrivateCustomers位对私顾客正在服务!n;/窗口正在服务,服务延时cout第PrivateCustomers位对私顾客离开!n;WaitCustoms-;/记录顾客离开的序号ReleaseMutex(

37、hSemaphoreSeats );/释放信号量使其它顾客可以到达窗口接受服务CloseHandle(PrivateSevice4); DWORD WINAPI PrivateSevice5(LPVOID lpParameter) while(1) if (PrivateCustomers = 5)cout对私窗口5空闲!n;/*开始对私服务PV操作*/WaitForSingleObject( hSemaphorePrivateCustomers , INFINITE );/检查有没有顾客等待服务,有则继续WaitForSingleObject( hMutex , INFINITE );/进入

38、等待室时不允许其他顾客进入WaitForSingleObject(PrivateSevice5 , INFINITE );/开始服务ReleaseMutex( hMutex );/释放互斥量,使其他人可以进入ReleaseSemaphore( hSemaphoreSeats ,1,NULL);/释放信号量使其它顾客可以进入等待室cout第PrivateCustomers位对私顾客正在服务!n;/窗口正在服务,服务延时cout第PrivateCustomers位对私顾客离开!n;WaitCustoms-;/记录顾客离开的序号ReleaseMutex( hSemaphoreSeats );/释放信

39、号量使其它顾客可以到达窗口接受服务CloseHandle(PrivateSevice5); DWORD WINAPI PrivateSevice6(LPVOID lpParameter) while(1) if (PrivateCustomers = 6)cout对私窗口6空闲!n;/*开始对私服务PV操作*/WaitForSingleObject( hSemaphorePrivateCustomers , INFINITE );/检查有没有顾客等待服务,有则继续WaitForSingleObject( hMutex , INFINITE );/进入等待室时不允许其他顾客进入WaitForSi

40、ngleObject(PrivateSevice6 , INFINITE );/开始服务ReleaseMutex( hMutex );/释放互斥量,使其他人可以进入ReleaseSemaphore( hSemaphoreSeats ,1,NULL);/释放信号量使其它顾客可以进入等待室cout第PrivateCustomers位对私顾客正在服务!n;/窗口正在服务,服务延时cout第PrivateCustomers位对私顾客离开!n;WaitCustoms-;/记录顾客离开的序号ReleaseMutex( hSemaphoreSeats );/释放信号量使其它顾客可以到达窗口接受服务Close

41、Handle(PrivateSevice6); DWORD WINAPI PrivateSevice7(LPVOID lpParameter) while(1) if (PrivateCustomers = 7)cout对私窗口7空闲!n;/*开始对私服务PV操作*/WaitForSingleObject( hSemaphorePrivateCustomers , INFINITE );/检查有没有顾客等待服务,有则继续WaitForSingleObject( hMutex , INFINITE );/进入等待室时不允许其他顾客进入WaitForSingleObject(PrivateSevi

42、ce7 , INFINITE );/开始服务ReleaseMutex( hMutex );/释放互斥量,使其他人可以进入ReleaseSemaphore( hSemaphoreSeats ,1,NULL);/释放信号量使其它顾客可以进入等待室cout第PrivateCustomers位对私顾客正在服务!n;/窗口正在服务,服务延时cout第PrivateCustomers位对私顾客离开!n;WaitCustoms-;/记录顾客离开的序号ReleaseMutex( hSemaphoreSeats );/释放信号量使其它顾客可以到达窗口接受服务CloseHandle(PrivateSevice7)

43、; void main() HANDLE hPublicCustomerstomersThread,hPrivateCustomerstomersThread ; /创建公有私有线程服务线程句柄 HANDLE hPublicSevice1,hPublicSevice2,hPublicSevice3,hPrivateSevice1,hPrivateSevice2,hPrivateSevice3,hPrivateSevice4,hPrivateSevice5,hPrivateSevice6,hPrivateSevice7; cout*欢迎来到中国银行!*endl; coutseat; coutendl; hMutex = CreateMutex ( NULL ,

温馨提示

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

评论

0/150

提交评论