Advertisement
Guest User

Untitled

a guest
May 31st, 2016
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.13 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <stdarg.h>
  5.  
  6. #include <pthread.h>
  7. #include <semaphore.h>
  8.  
  9. #define SIZE 5
  10.  
  11. sem_t forks[SIZE];
  12. pthread_t thread[SIZE];
  13.  
  14. /* volatile tells the compiler NOT to optimize anything
  15.    where this variable is used. So everytime a thread
  16.    needs this variable it fetches it without caching it
  17.    somewhere. */
  18. volatile int running = 1; // Not in use!
  19.  
  20. /* Because printf is buffered, I wrote
  21.    this function to prevent anything
  22.    get buffered. */
  23. void printflush(const char* format, ...)
  24. {
  25.     va_list args;
  26.     va_start(args, format);
  27.     vfprintf(stdout, format, args);
  28.     fflush(stdout);
  29.     va_end(args);
  30. }
  31.  
  32. void* thread_callback(void* arg)
  33. {
  34.     int index = *((int*)arg);
  35.     int lfork;
  36.     int rfork;
  37.  
  38.     /* calc index of left fork */
  39.     if(index == 0) lfork = SIZE-1;
  40.     else lfork = index - 1;
  41.  
  42.     /* calc index of left fork */
  43.     if(index == SIZE-1) rfork = 0;
  44.     else rfork = index + 1;
  45.  
  46.     /* check this every time (useless because I don't change it..) */
  47.     while(running)
  48.     {  
  49.         printflush("(%d) Try get left fork ... \n", index);
  50.         sem_wait(&forks[lfork]);
  51.  
  52.         /* Try to aquire the semaphore, if not unlock left fork, wait and
  53.            try again. */
  54.         printflush("(%d) Got left fork!\n", index);
  55.         if(sem_trywait(&forks[rfork]) != 0)
  56.         {
  57.             /* someone is using semaphore */
  58.             printflush("(%d) Someone is using semaphore ... "
  59.                     "trying later ...\n", index);
  60.        
  61.             sem_post(&forks[lfork]);
  62.             sleep(1);
  63.             continue;
  64.         }
  65.  
  66.         printflush("(%d) Got right fork!\nEating ...\n", index);
  67.         sleep(3);
  68.  
  69.         sem_post(&forks[rfork]);
  70.         printflush("(%d) Released right fork!\n", index);
  71.         sleep(1);
  72.  
  73.         sem_post(&forks[lfork]);
  74.         printflush("(%d) Released left fork!\n", index);
  75.         sleep(1);
  76.     }
  77.  
  78.     printflush("(%d) Quit ...\n", index);
  79.    
  80.     free(arg);
  81.     return NULL;
  82. }
  83.  
  84. int main(void)
  85. {
  86.     for(int i = 0; i < SIZE; i++)
  87.         sem_init(&forks[i], 0, 1);
  88.  
  89.     for(int i = 0; i < SIZE; i++)
  90.     {
  91.         int* num = malloc(sizeof(int));
  92.         *num = i;
  93.         pthread_create(&thread[i], NULL, thread_callback, num);
  94.     }
  95.  
  96.     for(int i = 0; i < SIZE; i++)
  97.         pthread_join(thread[i], NULL);
  98.  
  99.     return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement