教えてください

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
レムリア
記事: 1
登録日時: 5年前

教えてください

#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);
}

Math

Re: 教えてください

#2

投稿記事 by Math » 5年前

誰からも返信が無いようなので記しますが
ルールrulesに則って質問してくださいね。

unix 環境のコードのようでテストができません。この問題は自分で良く考え無いといろんな答えがあるでしょう。
セマフォの使い方は沢山あると思います。

ここなどを参考にしてください。
https://docs.oracle.com/cd/E27069_01/ht ... gepdy.html

返信

“C言語何でも質問掲示板” へ戻る