Advertisement
Guest User

Untitled

a guest
Mar 28th, 2015
426
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.47 KB | None | 0 0
  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5.  
  6. #define NumPhilos 5
  7.  
  8. typedef struct philData {
  9.     pthread_mutex_t *fork_lft, *fork_rgt;
  10.     const char *name;
  11.     pthread_t thread;
  12.     int   fail;
  13. } Philosopher;
  14.  
  15. int running = 1;
  16.  
  17. void *PhilPhunction(void *p) {
  18.     Philosopher *phil = (Philosopher*)p;
  19.     int failed;
  20.     int tries_left;
  21.     pthread_mutex_t *fork_lft, *fork_rgt, *fork_tmp;
  22.  
  23.     while (running) {
  24.         printf("%s is sleeping --er thinking\n", phil->name);
  25.         sleep( 1+ rand()%8);
  26.  
  27.         fork_lft = phil->fork_lft;
  28.         fork_rgt = phil->fork_rgt;
  29.         printf("%s is hungry\n", phil->name);
  30.         tries_left = 2;   /* try twice before being forceful */
  31.         do {
  32.             pthread_mutex_lock( fork_lft);
  33.             failed = (tries_left>0) ? pthread_mutex_trylock( fork_rgt ) : pthread_mutex_lock( fork_rgt );
  34.             if (failed) {
  35.                 pthread_mutex_unlock( fork_lft);
  36.                 fork_tmp = fork_lft;
  37.                 fork_lft = fork_rgt;
  38.                 fork_rgt = fork_tmp;
  39.                 tries_left -= 1;
  40.             }
  41.         } while(failed && running);
  42.  
  43.         if (!failed) {
  44.             printf("%s is eating\n", phil->name);
  45.             sleep( 1+ rand() % 8);
  46.             pthread_mutex_unlock( fork_rgt);
  47.             pthread_mutex_unlock( fork_lft);
  48.         }
  49.     }
  50.     return NULL;
  51. }
  52.  
  53. void Ponder()
  54. {
  55.     const char *nameList[] = { "Kant", "Guatma", "Russel", "Aristotle", "Bart" };
  56.     pthread_mutex_t forks[NumPhilos];
  57.     Philosopher philosophers[NumPhilos];
  58.     Philosopher *phil;
  59.     int i;
  60.     int failed;
  61.  
  62.     for (i=0;i<NumPhilos; i++) {
  63.         failed = pthread_mutex_init(&forks[i], NULL);
  64.         if (failed) {
  65.             printf("Failed to initialize mutexes.");
  66.             exit(1);
  67.         }
  68.     }
  69.  
  70.     for (i=0;i<NumPhilos; i++) {
  71.         phil = &philosophers[i];
  72.         phil->name = nameList[i];
  73.         phil->fork_lft = &forks[i];
  74.         phil->fork_rgt = &forks[(i+1)%NumPhilos];
  75.         phil->fail = pthread_create( &phil->thread, NULL, PhilPhunction, phil);
  76.     }
  77.  
  78.     sleep(40);
  79.     running = 0;
  80.     printf("cleanup time\n");
  81.  
  82.     for(i=0; i<NumPhilos; i++) {
  83.         phil = &philosophers[i];
  84.         if ( !phil->fail && pthread_join( phil->thread, NULL) ) {
  85.             printf("error joining thread for %s", phil->name);
  86.             exit(1);
  87.         }
  88.     }
  89. }
  90.  
  91. int main()
  92. {
  93.     Ponder();
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement