同步和互斥实验-吃水果问题、消费者问题参考模板_第1页
同步和互斥实验-吃水果问题、消费者问题参考模板_第2页
同步和互斥实验-吃水果问题、消费者问题参考模板_第3页
同步和互斥实验-吃水果问题、消费者问题参考模板_第4页
同步和互斥实验-吃水果问题、消费者问题参考模板_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

1、实验3 报告源程序1/*作者:wwj时间:2012/4/12功能:实现吃水果问题*题目内容:桌子有一只盘子,只允许放一个水果,父亲专向盘子放苹果,母亲专向盘子放桔子儿子专等吃盘子的桔子,女儿专等吃盘子的苹果。只要盘子为空,父亲或母亲就可以向盘子放水果,仅当盘子有自己需要的水果时,儿子和女儿可从盘子取出。请给出四个人之间的同步关系,并用pv操作实现四个人的正确活动的问题。*题目分析:父亲和女儿是相互制约的,父亲进程执行完即往盘中放入苹果后,女儿进程才能执行即吃苹果,是同步关系;母亲和儿子是相互制约的,母亲进程执行完即往盘中放入桔子,儿子进程才能执行即吃桔子,也是同步关系而父亲和母亲这两个进程不能

2、同时进行,是互斥关系;* */#include<windows.h>#include<iostream>using namespace std;/声明句柄HANDLE EmptyPlate;HANDLE Apple;HANDLE orange;HANDLE fatherThread;HANDLE motherThread;HANDLE sonThread;HANDLE daughterThread;/线程函数声明DWORD WINAPI father(LPVOID IpParameter);DWORD WINAPI mother(LPVOID IpParameter);

3、DWORD WINAPI daughter(LPVOID IpParameter);DWORD WINAPI son(LPVOID IpParameter);int main()/创建信号量EmptyPlate = CreateSemaphore(NULL,1,1,NULL); /盘子Apple = CreateSemaphore(NULL,0,1,NULL);/苹果1 / 7orange = CreateSemaphore(NULL,0,1,NULL); /桔子/创建线程fatherThread = CreateThread(NULL,0,father,NULL,0,NULL);mother

4、Thread = CreateThread(NULL,0,mother,NULL,0,NULL);daughterThread = CreateThread(NULL,0,daughter,NULL,0,NULL);sonThread = CreateThread(NULL,0,son,NULL,0,NULL);/等线程的结束WaitForSingleObject(fatherThread,INFINITE); WaitForSingleObject(motherThread,INFINITE); WaitForSingleObject(daughterThread,INFINITE); Wa

5、itForSingleObject(sonThread,INFINITE); /关闭线程句柄CloseHandle(fatherThread);CloseHandle(motherThread);CloseHandle(daughterThread);CloseHandle(sonThread);/关闭信号量句柄CloseHandle(EmptyPlate);CloseHandle(Apple);CloseHandle(orange);return 0;/父亲线程函数DWORD WINAPI father(LPVOID IpParameter)for(int i = 0; i < 5;

6、+i)WaitForSingleObject(EmptyPlate, INFINITE);/ P操作/ 开始临界区cout << "nFather往盘中放一个水果n"/ 结束临界区ReleaseSemaphore(Apple, 1, NULL);/ V操作return 0;/母亲线程函数DWORD WINAPI mother(LPVOID IpParmeter)for(int i = 0; i < 5; +i)WaitForSingleObject(EmptyPlate, INFINITE);/ P操作/ 开始临界区cout << "

7、nMother往盘中放一个桔子n"/ 结束临界区ReleaseSemaphore(orange, 1, NULL);/ V操作return 0;/女儿线程函数DWORD WINAPI daughter(LPVOID IpParameter)while(1)WaitForSingleObject(Apple,INFINITE); /p操作cout<<"女儿吃苹果"<<endl;ReleaseSemaphore(EmptyPlate,1,NULL); /v操作return 0;/儿子线程函数DWORD WINAPI son(LPVOID IpP

8、arameter)while(1)WaitForSingleObject(orange,INFINITE); /p操作cout<<"儿子吃苹果"<<endl;ReleaseSemaphore(EmptyPlate,1,NULL); /v操作return 0;程序运行结果截图:运行结果分析:从运行结果可知父进程执行完后,女儿进程立即执行,这说明父进程跟女儿进程有时序关系,只有当父进程执行之后,女儿进程才会执行,女儿进程是父进程的子线程,他们具有同步关系,同理;母亲进程跟儿子进程,也是同步关系。源程序2/*作者:wwj时间:2012/4/12功能:实现生

9、产者和消费者正常活动题目内容:生产者-消费者问题,是指两组进程共享一个环形的缓冲区。一组进程被称为生产者,另一组进程被称为消费者。缓冲池是由若干个(程序假设为4个)大小相等的缓冲区组成的,每个缓冲区可以容纳一个产品。生产者进程不断地将生产的产品放入缓冲池,消费者进程不断地将产品从缓冲池取出。用PV操作实现生产者和消费者的正常活动的程序题目分析:在生产者-消费者问题中,既存在进程同步问题,也存在着临界区的互斥问题。当缓冲区都满时,表示供大于求,生产者停止生产,进入等待状态,同时唤醒消费者;当缓冲区都空时,表示供不应求,消费者停止消费,唤醒生产者。这说明了,生产者和消费者存在同步关系。对于缓冲池,

10、它显然是一个临界资源,所有的生产者和消费者都要使用它,而且都要改变它的状态,故对于缓冲池的操作必须是互斥的。*/#include<Windows.h>#include<iostream>using namespace std;const int n=4;/声明全局变量int i=0,j=0;/i和j分别指向缓冲区int buffern;/缓冲池int ItemP=0;/用来存放生产的产品int ItemC=0;/用来存放消费的产品/声明句柄HANDLE mutex;/缓冲池信号量HANDLE empty;/空缓冲区信号量HANDLE full;/满缓冲区信号量HANDL

11、E pThread;/producer线程句柄HANDLE cThread;/consumer线程句柄/声明进程函数DWORD WINAPI producer(LPVOID IpParameter);DWORD WINAPI consumer(LPVOID IpParameter);int main()/创建信号量mutex = CreateSemaphore(NULL,1,1,NULL);empty = CreateSemaphore(NULL,1,4,NULL);full = CreateSemaphore(NULL,0,4,NULL);cout<<"市场运作开始。&

12、quot;<<endl;/创建线程pThread = CreateThread(NULL,0,producer,NULL,0,NULL);cThread = CreateThread(NULL,0,consumer,NULL,0,NULL);/等待相应线程结束WaitForSingleObject(pThread,INFINITE); WaitForSingleObject(cThread,INFINITE); /关闭线程句柄CloseHandle(pThread);CloseHandle(cThread);/关闭信号量句柄CloseHandle(mutex);CloseHandl

13、e(empty);CloseHandle(full);cout<<"整个市场运营结束。"<<endl;return 0;/producer线程函数的定义DWORD WINAPI producer(LPVOID IpParameter)for(int k=0;k<5;k+)cout<<"nproducer生产一个产品"<<endl;ItemP=ItemP+1;/增加一个产品WaitForSingleObject(empty,INFINITE);/P操作WaitForSingleObject(mutex,

14、INFINITE);cout<<"n把一个产品放入了一个空的缓冲区"<<endl;bufferi=ItemP;/将产品放入缓冲区i=(i+1)%n;ReleaseSemaphore(mutex,1,NULL);/V操作ReleaseSemaphore(full,1,NULL);return 0;DWORD WINAPI consumer(LPVOID IpParameter)for(int k=0;k<5;k+)WaitForSingleObject(full,INFINITE);/P操作WaitForSingleObject(mutex,INFINITE);ItemC=bufferj;/将缓冲区里的产品取出,放入消费产品里头j=(j+1)%n;/j指向下一个满的缓冲区ReleaseSemaphore(mutex,1,NULL);/V操作ReleaseSemaphore(empty,1,NULL);cout<<"n消费者消费一个产品"<<endl;ItemC=ItemC-1;/消费一个产品return 0;程序运行截图如下:运行结果分析:从运行结果来看,整个市场运作有两种状态, 一种状态是生产着连续生产两个产品,每生产一个产品后,立马把产品产品放入缓冲区,接着消费者消费产

温馨提示

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

评论

0/150

提交评论