?? b2.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 + -