操作系统实验二Mutex_第1页
操作系统实验二Mutex_第2页
操作系统实验二Mutex_第3页
操作系统实验二Mutex_第4页
操作系统实验二Mutex_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、操作系统 实验一姓名:廖桉冬 学号:09012431日期:15/4/29实验内容:在Windows和Linux操作系统上,利用各自操作系统提供的Mutex和信号量机制(Win32 API或Pthreads),实现生产者/消费者问题。具体要求见”Operating System Concepts(Seventh Edition)” Chapter 6后的Project(P236-241)。实验目的:通过实验,理解Win32 API、Pthreads中mutex locks、semaphores等使用方法,并掌握如何利用它们实现进程(线程)间的同步和互斥。设计思路和流程图生产者/消费者主要考虑两个

2、同步问题:1、 产品队列被两者共同访问,因此需要保持产品变化的互斥性;2、 产品有上限,因此生产者不能无限生产,多个生产者应该保持同步;消费者亦然。/生产者Do/produce an itemWait(empty);/队列有空位才能将产品放入Wait(mutex);/互斥访问队列/add productSignal(mutex);Signal(full);/告诉消费者有产品可以取用/消费者DoWait(full);/队列有产品才能消费Wait(mutex);/互斥访问队列/consume productSignal(mutex);Signal(full);/告诉生产者队列有空位主要数据结构及其

3、说明int BuffM:有限缓冲队列HANDLE/sem_t Mutex:互斥锁HANDLE/sem_t Full/Empty:队列有物品/空位的信号源程序并附上注释/WIN32#include <iostream>#include<stdio.h>#include <stdlib.h>#include <time.h>/系统调用#include<windows.h>#include<process.h>using namespace std;#define M 10#define Random_Max 50/插入随机数最

4、大值int buffM=0; /缓冲区大小为10int in=0;/生产者下标int out=0;/消费者下标int prod_id=0,proc_id=0;/初始化idbool con=true;HANDLE Empty=NULL; /空缓冲信号量HANDLE Full=NULL;/满缓冲信号量HANDLE Mutex=NULL;/缓冲区互斥锁void produce();void consume();UINT _stdcall ThreadProd(LPVOID);UINT _stdcall ThreadCons(LPVOID);/生产void produce()/随机产生“产品”放入队列

5、srand(time(0);int j = rand() % Random_Max;buffin=j;/打印生产信息cout<<" produce "<<j<<" into buffer"<<endl;/指针移动,下一个空项in = (in+1)%M;/消费void consume()cout<<" consume "<<buffout<<" from buffer"<<endl;/指针移动,下一个满项out = (ou

6、t+1)%M;/生产者入口函数UINT _stdcall ThreadProd(LPVOID)int id=+prod_id;while(1) /初始化srand(time(0);int i = rand() % 1000; Sleep(i+3000);/等待队列空WaitForSingleObject(Empty,INFINITE);/等待互斥锁WaitForSingleObject(Mutex,INFINITE);/打印生产者信息cout<<"Producer:"<<id;/生产produce();/释放semaphoreReleaseSemap

7、hore(Full,1,NULL);ReleaseSemaphore(Mutex,1,NULL);return 0;/消费者入口函数UINT _stdcall ThreadCons(LPVOID)int id=+proc_id;while(1)/初始化srand(time(0);int i = rand() % 1000;Sleep(i);/等待队列WaitForSingleObject(Full,INFINITE);/等待互斥锁WaitForSingleObject(Mutex,INFINITE);cout<<"Consumer:"<<id;/消费

8、consume();/释放ReleaseSemaphore(Empty,1,NULL);ReleaseSemaphore(Mutex,1,NULL);return 0;void main()/标识主进程UINT uId;int prod_num,cons_num,runtime;cout<<"请输入生产者个数和消费者个数:"cin>>prod_num>>cons_num;cout<<"请输入运行时间"cin>>runtime;/线程标识HANDLE *h_producer = new HANDL

9、Eprod_num;HANDLE *h_consumer = new HANDLEcons_num;/初始化Empty = CreateSemaphore(NULL,M,M,NULL);/ 缓冲区满,无法生产Full = CreateSemaphore(NULL,0,M,NULL);/缓冲区空,无法消费Mutex = CreateSemaphore(NULL,1,1,NULL);/ 线程互斥/创建N个生产者int i;for(i=0;i<prod_num;i+) h_produceri=(HANDLE):_beginthreadex(NULL,0,ThreadProd,NULL,0,&a

10、mp;uId);/创建N个消费者for(i=0;i<cons_num;i+) h_consumeri=(HANDLE):_beginthreadex(NULL,0,ThreadCons,NULL,0,&uId);Sleep(runtime);/LINUX(Pthread)#include <pthread.h>#include <semaphore.h>#include <iostream>#include <stdlib.h>#include <unistd.h>#include <time.h>#incl

11、ude <stdio.h>using namespace std;#define M 10#define Random_Max 50int buffM=0; int prod_id=0;sem_t Empty;sem_t Full;sem_t Mutex; void produce();void consume();void *producer(void *);void *consumer(void *);void produce()srand(time(0);int j = rand() % Random_Max;buffin=j;cout<<" produ

12、ce "<<j<<" into buffer"<<endl;in = (in+1)%M;void consume()cout<<" consume "<<buffout<<" from buffer"<<endl;out = (out+1)%M;void *producer(void *arg)int id=+prod_id;while(1)srand(time(0);int i = rand() % 5; sleep(i);sem_wait

13、(&Empty);sem_wait(&Mutex);cout<<"Producer"<<id;produce();sem_post(&Full);sem_post(&Mutex);cout<<"end"<<endl;return 0;void *consumer(void *arg)int id=+prod_id;while(1)srand(time(0);int i = rand() % 5;sleep(i);sem_wait(&Full);sem_wait(&am

14、p;Mutex);cout<<"Consumer "<<id;consume();sem_post(&Empty);sem_post(&Mutex);return 0;int main()int prod_num,cons_num,runtime;cout<<"input producer and consumer number:"cin>>prod_num>>cons_num;cout<<"input how long main sleep:"c

15、in>>runtime;pthread_t *h_producer = new pthread_tprod_num;pthread_t *h_consumer = new pthread_tcons_num;sem_init(&Empty,0,M);sem_init(&Full,0,0);sem_init(&Mutex,0,1); int i;for(i=0;i<prod_num;i+)pthread_create(&h_produceri, NULL,producer, NULL);for(i=0;i<cons_num;i+)pthread_create(&h_consumeri, NULL,consumer, NULL);sleep(runtime);程序运行时的初值和运行结果消费者:10 生产者:10 运行时间:6000

温馨提示

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

评论

0/150

提交评论