⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 b2.c

📁 Linux 下 system 的实验程序 5 生产 消费问题 改良
💻 C
字号:
#include<stdio.h>#include<pthread.h>#include<signal.h>#define N_PHILO 5#define VOISIN_A_DROITE ((i+1)%N_PHILO)#define VOISIN_A_GAUCHE ((i+4)%N_PHILO)#define PENSER 0#define DECIDER_DE_MANGER 1#define MANGER 2void* philosophe(void*);void penser(int);void prendre_baguettes(int);void manger(int);void poser_baguettes(int);void test_philosophes_voisins(int);void liberation_mutex(int);int etat_Philo[N_PHILO];pthread_mutex_t mutex;pthread_cond_t cond[N_PHILO];pthread_t pthread_id[N_PHILO];void* philosophe(void* p){  int i;  i=(int)p;  printf("Philosophe %d : Je m'assoie a la table\n",i);  while(1){    penser(i);    prendre_baguettes(i);    manger(i);    poser_baguettes(i);  }}void prendre_baguettes(int i){  printf("Philosophe %d : Je veux manger\n",i);  pthread_mutex_lock(&mutex);  etat_Philo[i]=DECIDER_DE_MANGER;  while((etat_Philo[VOISIN_A_DROITE]==MANGER)||(etat_Philo[VOISIN_A_GAUCHE]==MANGER)){    pthread_cond_wait(cond+i,&mutex);  }  etat_Philo[i]=MANGER;  pthread_mutex_unlock(&mutex);}/*void test_philosophes_voisins(int i){  if((etat_Philo[i]==DECIDER_DE_MANGER)&&     (etat_Philo[VOISIN_A_DROITE]!=MANGER)&&     (etat_Philo[VOISIN_A_GAUCHE]!=MANGER)){    pthread_mutex_unlock(mutex+i);    etat_Philo[i]=MANGER;  }  }*/void poser_baguettes(int i){  pthread_mutex_lock(&mutex);  etat_Philo[i]=PENSER;  pthread_cond_signal(&cond[VOISIN_A_DROITE]);  pthread_cond_signal(&cond[VOISIN_A_GAUCHE]);  pthread_mutex_unlock(&mutex);  printf("Philosophe %d : J'ai fini de manger\n",i);}void penser(int i){  printf("Philosophe %d : Je pense\n",i);  sleep(2);}void manger(int i){  printf("Philosophe %d : Je mange\n",i);  sleep(2);}void liberation_mutex(int sig){  int i;  for(i=0;i<N_PHILO;i++){    pthread_cond_destroy(cond+i);    printf("Philosophe %d : Je sort de table\n",i);  }  pthread_mutex_destroy(&mutex);  exit(0);}int main(int argc,char **argv){  struct sigaction action;  int i;  action.sa_handler=liberation_mutex;  sigaction(SIGINT,&action,NULL);  sigaction(SIGQUIT,&action,NULL);  printf("Initialisation des semaphores\n");  for(i=0;i<N_PHILO;i++){    pthread_cond_init(cond+i,NULL);  }  pthread_mutex_init(&mutex,NULL);  for(i=0;i<N_PHILO;i++){    if(pthread_create(pthread_id+i,NULL,philosophe,(void*)i)==-1){      fprintf(stderr,"Erreur de creation du thread %d\n",i);      exit(-2);    }  }  pthread_exit(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -