📄 philosopher0.c
字号:
#include<stdio.h>#include<sys/types.h>#include<linux/sem.h>#include<stdlib.h>#define N 5#define TURE 1#define LEFT (i+4)%N#define RIGHT (i+1)%N#define THINKING 0#define HUNGRY 1#define EATING 2int main (){ int i; pid_t pid; int semid; int nsems=2*N+1; int flags=0666; union semun t; semid=semget(IPC_PRIVATE,nsems,flags); if(semid<0) { perror("semget"); exit(-1); } i=1; t.val=0; while(i<N+6) { semctl(semid,i,SETVAL,t);i++; } t.val=1; semctl(semid,0,SETVAL,t); i=0; while(i<N) { if((pid=fork())<0) { printf("Fork()Error\n"); exit(-1); } else if(pid==0) { printf("zijincheng %d ",i); philosopher(i,semid);exit(1); } else { printf("fujicheng %d ",i); } i++; } return 0;}int think(int i){ int s=rand()%11; switch(s) { case 0:sleep(10);break; case 1:sleep(20);break; case 2:sleep(12);break; case 3:sleep(16);break; case 4:sleep(7);break; case 5:sleep(15);break; case 6:sleep(2);break; case 7:sleep(8);break; case 8:sleep(22);break; case 9:sleep(5);break; //case 10:delay(1000);break; default:sleep(12); } printf("philosopher %d is thinking!\n",i); return 1;}void eat(int i){ printf("philosopher %d is eating!\n",i); sleep(5);}void take_fork(int i,int semid){ struct sembuf buf; union semun t; buf.sem_num=0; buf.sem_op=-1; buf.sem_flg=0; semop(semid,&buf,1); //p(m) //printf("%d",semctl(semid,0,GETVAL)); /*buf.sem_num=N+1+i; buf.sem_op=1; buf.sem_flg=0; semop(semid,&buf,1);*/ t.val=HUNGRY; semctl(semid,N+1+i,SETVAL,t); //state[i]=HUNGRY; //printf("%d",semctl(semid,N+1+i,GETVAL)); test(i,semid); buf.sem_num=0; buf.sem_op=1; buf.sem_flg=0; semop(semid,&buf,1); //v(m) //printf("%d",semctl(semid,0,GETVAL)); buf.sem_num=1+i; buf.sem_op=1; buf.sem_flg=0; semop(semid,&buf,1); //p(s[i]) //printf("%d",semctl(semid,1+i,GETVAL));}void put_fork(int i,int semid){ struct sembuf buf; union semun t; buf.sem_num=0; buf.sem_op=-1; buf.sem_flg=0; semop(semid,&buf,1); //p(m) /* buf.sem_num=N+1+i; buf.sem_op=-2; buf.sem_flg=0; semop(semid,&buf,1);*/ t.val=THINKING; semop(semid,N+1+i,SETVAL,t); //state[i]=THINKING; test(LEFT,semid); test(RIGHT,semid); buf.sem_num=0; buf.sem_op=1; buf.sem_flg=0; semop(semid,&buf,1); //v(m)}int test(int i,int semid){ int l,r,o; struct sembuf buf; union semun t; o=semctl(semid,N+1+i,GETVAL); l=semctl(semid,N+1+LEFT,GETVAL); r=semctl(semid,N+1+RIGHT,GETVAL); if(o==HUNGRY && l!=EATING && r!=EATING) { /*buf.sem_num=N+1+i; buf.sem_op=1; buf.sem_flg=0; semop(semid,&buf,1);*/ t.val=EATING; //state[i]=EATING; semctl(semid,N+1+i,SETVAL,t); buf.sem_num=1+i; buf.sem_op=1; buf.sem_flg=0; semop(semid,&buf,1); // v(s); } return 1; }int philosopher (int i,int semid){ while (TURE) { think(i); take_fork(i,semid); eat(i); put_fork(i,semid); } return 1; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -