?? philo.c
字號:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <unistd.h>
#include "ourhdr.h"
#define N 5
#define LEFT (i+N-1)%N
#define RIGHT (i+1)%N
#define THINKING 0
#define HUNGRY 1
#define EATING 2
#define TRUE 1
void philosopher(int i);
void takechopsticks(int i);
void putchopsticks(int i);
void test(int i);
void think(void);
void eat(void);
void down(int sid);
void up(int sid);
int *state;
int mutex=1;
int s[N];
int
main(void)
{
int k=0,i=0,shmid;
key_t key,sk;
key_t pkey[5];
pid_t pid;
char p[20]="ourhdr.h\0";
printf("it");
//sk=ftok(p,8);
shmid=shmget(IPC_PRIVATE, 5*sizeof(int), 384);
state=(int *)shmat(shmid,NULL,0);
printf("it");
for(k=0;k<N;k++){
state[k]=THINKING;
}
for(k=0;k<N;k++){
s[k]=k+2;
}
key=ftok(p,mutex);
for(k=0;k<N;k++){
pkey[k]=ftok(p,s[k]);
}
mutex=semget(key,1,384);
for(k=0;k<N;k++){
s[k]=semget(pkey[k],1,384);
}
for(k=0;k<N;k++){
if((pid=fork())<0)return(-1);
else if(pid==0)philosopher(k);
}
while(TRUE){
sleep(3);
for(i=0;i<N;i++){
printf("state %d is %d\n",i,state[i]);
}
printf("\n");
}
return(0);
}
void philosopher(int i)
{
while(TRUE){
think();
takechopsticks(i);
eat();
putchopsticks(i);
}
}
void takechopsticks(int i)
{
down(mutex);
state[i]=HUNGRY; test(i);
up(mutex);
down(s[i]);
}
void putchopsticks(int i)
{
down(mutex);
state[i]=THINKING;
test(LEFT); test(RIGHT);
up(mutex);
}
void test(i)
{
if(state[i]==HUNGRY &&state[LEFT]!=EATING&&state[RIGHT]!=EATING){
state[i]=EATING;up(s[i]);
}
}
void down(int sid)
{
struct sembuf op;
op.sem_num=0;
op.sem_op=-1;
op.sem_flg=0;
semop(sid, &op, 1);
}
void up(int sid)
{
struct sembuf op;
op.sem_num=0;
op.sem_op=1;
op.sem_flg=0;
semop(sid, &op, 1);
}
void think()
{
int s;
srand((int)time(0));
s=(int)(10.0*rand()/(RAND_MAX+1.0));
sleep(s);
}
void eat()
{
int s;
srand((int)time(0));
s=(int)(5.0*rand()/(RAND_MAX+1.0));
sleep(s);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -