#1
by レムリア » 5年前
今、食事をする哲学者の問題のコードを考えているのですがデッドロックを解消するために資源の確保する絶対的な順位をつけたいのですがどうすればよいのかわからないので教えてください。
コード:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#define N 3
#define Left_chopstick(x) (Chopstick[x])
#define Right_chopstick(x) (Chopstick[((x)+1)%N])
typedef struct{
int pfd[2];
}Semaphore;
Semaphore Chopstick[N];
void simulate_behaviour_of_philosopher(int k);
void Print_an_event(int k, char *event);
void initialize_semaphore();
void P(Semaphore sem);
void V(Semaphore sem);
int main(void)
{
int k,status,l=0,r=0;
initialize_semaphore();
for(k=0;k<N;k++)
printf("Philosopher%2d ",k);
printf("\n");
for(k=0;k<N;k++)
printf("-------------------- ");
printf("\n");
for(k=0;k<N;k++)
{
if(fork()==0)
{
simulate_behaviour_of_philosopher(k);
exit(EXIT_SUCCESS);
}
}
for(k=0;k<N;k++)
wait(&status);
return 0;
}
void simulate_behaviour_of_philosopher(int k)
{
int i;
for(i=0;i<5;i++)
{
P(Left_chopstick(k));
Print_an_event(k,"pick up left stick");
Print_an_event(k," ***thinking***");
sleep(1);
P(Right_chopstick(k));
Print_an_event(k,"pick up right stick");
Print_an_event(k,"***eating***");
sleep(1);
Print_an_event(k,"put down left stick");
V(Left_chopstick(k));
Print_an_event(k,"put down right stick");
V(Right_chopstick(k));
Print_an_event(k," ***thinking***");
sleep(1);
}
}
void Print_an_event(int k,char *event)
{
int i,indentsize;
indentsize=22*k;
for(i=0;i<indentsize;i++)
putchar(' ');
printf("%s\n",event);
}
void initialize_semaphore()
{
int i;
for(i=0;i<N;i++)
{
pipe(Chopstick[i].pfd);
write(Chopstick[i].pfd[1], "x", 1);
}
}
void P(Semaphore sem)
{
char token;
read(sem.pfd[0],&token,1);
}
void V(Semaphore sem)
{
write(sem.pfd[1],"x",1);
}
今、食事をする哲学者の問題のコードを考えているのですがデッドロックを解消するために資源の確保する絶対的な順位をつけたいのですがどうすればよいのかわからないので教えてください。
[code]
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#define N 3
#define Left_chopstick(x) (Chopstick[x])
#define Right_chopstick(x) (Chopstick[((x)+1)%N])
typedef struct{
int pfd[2];
}Semaphore;
Semaphore Chopstick[N];
void simulate_behaviour_of_philosopher(int k);
void Print_an_event(int k, char *event);
void initialize_semaphore();
void P(Semaphore sem);
void V(Semaphore sem);
int main(void)
{
int k,status,l=0,r=0;
initialize_semaphore();
for(k=0;k<N;k++)
printf("Philosopher%2d ",k);
printf("\n");
for(k=0;k<N;k++)
printf("-------------------- ");
printf("\n");
for(k=0;k<N;k++)
{
if(fork()==0)
{
simulate_behaviour_of_philosopher(k);
exit(EXIT_SUCCESS);
}
}
for(k=0;k<N;k++)
wait(&status);
return 0;
}
void simulate_behaviour_of_philosopher(int k)
{
int i;
for(i=0;i<5;i++)
{
P(Left_chopstick(k));
Print_an_event(k,"pick up left stick");
Print_an_event(k," ***thinking***");
sleep(1);
P(Right_chopstick(k));
Print_an_event(k,"pick up right stick");
Print_an_event(k,"***eating***");
sleep(1);
Print_an_event(k,"put down left stick");
V(Left_chopstick(k));
Print_an_event(k,"put down right stick");
V(Right_chopstick(k));
Print_an_event(k," ***thinking***");
sleep(1);
}
}
void Print_an_event(int k,char *event)
{
int i,indentsize;
indentsize=22*k;
for(i=0;i<indentsize;i++)
putchar(' ');
printf("%s\n",event);
}
void initialize_semaphore()
{
int i;
for(i=0;i<N;i++)
{
pipe(Chopstick[i].pfd);
write(Chopstick[i].pfd[1], "x", 1);
}
}
void P(Semaphore sem)
{
char token;
read(sem.pfd[0],&token,1);
}
void V(Semaphore sem)
{
write(sem.pfd[1],"x",1);
}
[/code]