📄 philosopher0.c
字号:
#include<sys/ipc.h>#include<stdio.h>#include<sys/types.h>#include<sys/sem.h>#include<stdlib.h>#define N 5#define TURE 1#define LEFT (i-1)%N#define RIGHT (i+1)%N#define THINKING 0#define HUNGRY 1#define EATING 2union semun{ int val; struct semid_ds *buf; ushort *array; struct seminfo *_buf; void *_pad;}void 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); i=1; t.val=0; while(i<N+1) { semctl(semid,i,SETVAL,t);i++; } i=N+1; t.val=0; while(i<N+6) { semctl(semid,i,SETVAL,t);i++; } t.val=1; setctl(semid,0,1,t); if(semid<0) { perror("semget"); exit(-1); } i=0; while(i<N) { if((pid=fork())<0) { printf("Fork()Error\n"); exit(-1); } else if(pid==0) { philosopher(i); } else { wait(0); } i++; }}void think(int i){ int s=rand(10); switch(s) { case 1:delay(100);break; case 2:delay(200);break; case 3:delay(300);break; case 4:delay(400);break; case 5:delay(500);break; case 6:delay(600);break; case 7:delay(700);break; case 8:delay(800);break; case 9:delay(900);break; //case 10:delay(1000);break; default:delay(1100); } printf("philosopher %d is thinking!\n",i);}void eat(int i){ printf("philosopher %d is eating!\n",i); delay(10);}void take_fork(int i){ struct sembuf buf; 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=-1; buf.sem_flg=0; semop(semid,&buf,1); //state[i]=HUNGRY; test(i); buf.sem_num=0; buf.sem_op=-1; buf.sem_flg=0; semop(semid,&buf,1); //v(m) buf.sem_num=1+i; buf.sem_op=1; buf.sem_flg=0; semop(semid,&buf,1); //p(s[i])}void put_fork(int i){ struct sembuf buf; 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); //state[i]=THINKING; test(LEFT); test(RIGHT); buf.sem_num=0; buf.sem_op=-1; buf.sem_flg=0; semop(semid,&buf,1); //v(m)}void test(int i){ int l,r,o; union semun t; semctl(semid,N+1+i,GETVAL,t); o=t.val; semctl(semid,N+i,GETVAL,t); l=t.val; semctl(semid,N+2+i,GETVAL,t); r=t.val; 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); //state[i]=EATING; buf.sem_num=1+i; buf.sem_op=-1; buf.sem_flg=0; semop(semid,&buf,1); // v(s); } }int philosopher (int i){ while (TURE) { think(i); take_fork(i); take_fork((i+1)%N); eat(i); put_fork(i); put_fork((i+1)%N); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -