logo资料库

山东大学 操作系统 铁路 管程 实验六.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
Dp.h #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef union semuns{ }Sem_uns; enum State{waiting,running}; class Sema{ public: int val; Sema(int id); ~Sema(); int down(); int up(); int sem_id; private: }; class Lock{ public: Lock(Sema *lock); ~Lock(); void close_lock(); void open_lock(); Sema *sema; private: }; class Condition{ public: Condition(char *st[], Sema *sm); ~Condition(); void Wait(Lock *lock,int i); void Signal(int i); Sema *sema; char **state; private: }; class dp{ public: dp(int rate=3); ~dp(); void pickup(int i); void putdown(int i); int get_ipc_id(char *proc_file,key_t key);
int set_sem(key_t sem_key,int sem_val,int sem_flag); char *set_shm(key_t shm_key,int shm_num,int shm_flag); int no; queue inQue; queue waitQue; private: int rate ; Lock *lock; char *state[2]; Condition *self[2]; }; Dp.cpp #include "dp.h" using namespace std; Sema::Sema(int id) { sem_id = id; } Sema::~Sema(){ } int Sema::down() { } int Sema::up() { struct sembuf buf; buf.sem_op = -1; buf.sem_num = 0; buf.sem_flg = SEM_UNDO; if((semop(sem_id,&buf,1)) <0) { perror("down error "); exit(EXIT_FAILURE); } return EXIT_SUCCESS; Sem_uns arg; struct sembuf buf; buf.sem_op = 1; buf.sem_num = 0; buf.sem_flg = SEM_UNDO; if((semop(sem_id,&buf,1)) <0) { perror("up error "); exit(EXIT_FAILURE); } return EXIT_SUCCESS; } Lock::Lock(Sema * s) { sema = s; } Lock::~Lock(){ } void Lock::close_lock() { } void Lock::open_lock() sema->down();
sema->up(); { } Condition::Condition(char *st[] ,Sema *sm){ state = st; sema = sm; } void Condition::Wait(Lock *lock,int i) { if((*state[(i+1)%2]!=running)&&(*state[i]==waiting))*state[i]=running; else {// //cout<<"p"<open_lock(); sema->down(); lock->close_lock(); } void Condition::Signal(int i) { if((*state[(i+1)%2]!=running)&&(*state[i]==waiting)) { sema->up(); *state[i]=running; } } } int dp::get_ipc_id(char *proc_file,key_t key) { #define BUFSZ 256 FILE *pf; int i,j; char line[BUFSZ],colum[BUFSZ]; if((pf = fopen(proc_file,"r")) == NULL){ perror("Proc file not open"); exit(EXIT_FAILURE); } fgets(line, BUFSZ,pf); while(!feof(pf)){ i = j = 0; fgets(line, BUFSZ,pf); while(line[i] == ' ') i++; while(line[i] !=' ') colum[j++] = line[i++]; colum[j] = '\0'; if(atoi(colum) != key) continue; j=0; while(line[i] == ' ') i++; while(line[i] !=' ') colum[j++] = line[i++]; colum[j] = '\0'; i = atoi(colum); fclose(pf); return i; } fclose(pf);
return -1; } int dp::set_sem(key_t sem_key,int sem_val,int sem_flg) { int sem_id; Sem_uns sem_arg; if((sem_id=get_ipc_id("/proc/sysvipc/sem",sem_key)) < 0 ){ if((sem_id = semget(sem_key,1,sem_flg)) < 0){ perror("semaphore create error"); exit(EXIT_FAILURE); } } sem_arg.val = sem_val; if(semctl(sem_id,0,SETVAL,sem_arg) < 0){ perror("semaphore set error"); exit(EXIT_FAILURE); } return sem_id; } char * dp::set_shm(key_t shm_key,int shm_num,int shm_flg) { int i,shm_id; char * shm_buf; if((shm_id=get_ipc_id("/proc/sysvipc/shm",shm_key))<0){ if((shm_id= shmget(shm_key,shm_num,shm_flg)) <0){ perror("shareMemory set error"); exit(EXIT_FAILURE); } if((shm_buf=(char *)shmat(shm_id,0,0)) < (char *)0){ perror("get shareMemory error"); exit(EXIT_FAILURE); for(i=0; i
} } //放下筷子的操作 //状态改变为思考,如左右邻居有阻塞者则唤醒它 void dp::putdown(int i){ int j; lock->close_lock();//进入管程,上锁 *state[i]=waiting; //进思考态 j = (i+1)%2; self[j]->Signal(j);//唤醒左邻居 //j = (i+1)%5; //self[j]->Signal(j);//唤醒右邻居 lock->open_lock();//离开管程,开锁 //cout << "p" <close_lock();//进入管程,上锁 *state[i]=waiting; //进饥饿态 int NO=inQue.front();inQue.pop(); waitQue.push(NO); cout << "p" <Wait(lock,i); //测试是否能拿到两只筷子 int ON=waitQue.front();waitQue.pop(); cout << "p" << i+1<<" NO:"<open_lock();//离开管程,开锁 << " waiting\n"; } dp::~dp(){} /* int main(int argc,char **argv) { dp *tdp;//管程对象指针 int pid[2]; int rate;// rate=(argc>1)?atoi(argv[1]):3; tdp = new dp(rate); //建立一个哲学家就餐的管程对象
pid[0]=fork(); //建立第一个哲学家进程 if(pid[0]<0){ perror("p1 create error"); exit(EXIT_FAILURE); } else if(pid[0]==0){ //利用管程模拟第一个哲学家就餐的过程 while(1){ tdp->pickup(0);//拿起筷子 tdp->putdown(0);//放下筷子 } } pid[1]=fork(); if(pid[1]<0){ //建立第二个哲学家进程 perror("p2 create error"); exit(EXIT_FAILURE); } else if(pid[1]==0){ //利用管程模拟第二个哲学家就餐的过程 while(1){ tdp->pickup(1);//拿起筷子 tdp->putdown(1);//放下筷子 } } }*/ Main.cpp #include #include"dp.h" pthread_t p1,p2; void *createThread1(void *arg); void *createThread2(void *arg); /* void* createThread(void * arg) { dp *tdp=(dp *)arg; tdp->pickup(0); tdp->putdown(0); }*/ int main(int argc,char **argv) { dp *tdp1,*tdp2;//管程对象指针 int pid[2]; int rate;// rate=(argc>1)?atoi(argv[1]):3; tdp1 = new dp(rate); //建立一个哲学家就餐的管程对象 tdp2 = new dp(rate); srand((unsigned int)time(NULL)); pid[0]=fork(); //建立第一个哲学家进程 if(pid[0]<0){
perror("p1 create error"); exit(EXIT_FAILURE); } else if(pid[0]==0){ //利用管程模拟第一个哲学家就餐的过程 while(1){ pthread_create(&p1,NULL,createThread1,(void *)tdp1); //tdp->pickup(0);//拿起筷子 //tdp->putdown(0);//放下筷子 //printf("%d\n",getpid()); sleep(rand()%10); } } else { while(1){ pthread_create(&p2,NULL,createThread2,(void *)tdp2); //tdp->pickup(0);//拿起筷子 //printf("%d\n",getpid()); sleep(rand()%10); //tdp->putdown(0);//放下筷子 } } /*pid[1]=fork(); if(pid[1]<0){ //建立第二个哲学家进程 perror("p2 create error"); exit(EXIT_FAILURE); } else if(pid[1]==0){ //利用管程模拟第二个哲学家就餐的过程 while(1){ tdp->pickup(1);//拿起筷子 tdp->putdown(1);//放下筷子 } }*/ } void* createThread1(void { * arg) dp *tdp=(dp *)arg; int no=(rand()+1)%100000000; tdp->inQue.push(no); tdp->pickup(0); tdp->putdown(0); } void* createThread2(void { * arg) dp *tdp=(dp *)arg; int no=rand()%100000000; tdp->inQue.push(no); tdp->pickup(1); tdp->putdown(1); }
Author sdu software college 200904 xxc 如有任何问题请发邮箱 411767596@qq.com
分享到:
收藏