C Programul de Beta Parcare

Cum se scrie un program C pentru a Beta Parcare în limbajul de programare C ?


Solution:


  1. /* parcare beta */
  2.  
  3. #include <pthread.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include </usr/include/semaphore.h>
  7.  
  8. #define BUFF_SIZE 5
  9. #define NR_MASINI 5
  10.  
  11. typedef struct{
  12.         int buf[BUFF_SIZE];
  13.         int in;
  14.         int out;
  15.         sem_t full;
  16.         sem_t empty;
  17.         pthread_mutex_t mutex;
  18. }parcare;
  19.  
  20. parcare p;
  21.  
  22. void* MasinaIn(void*arg)
  23. {
  24.  
  25. int index = (int)arg;
  26. int item,i;
  27.  
  28. for (i=0; i < 20; i++)
  29. {
  30. item =i;
  31.  
  32. sem_wait(&p.empty);
  33. pthread_mutex_lock(&p.mutex);
  34. p.buf[p.in] = item;
  35. p.in = (p.in+1)%BUFF_SIZE;
  36. printf("\nEste parcata masina pe pozitia %d",index);
  37. fflush(stdout);
  38.  
  39.  pthread_mutex_unlock(&p.mutex);
  40.         /* Increment the number of full slots */
  41.         sem_post(&p.full);
  42.  
  43. }
  44. return NULL;
  45. }
  46.  
  47.  
  48.  
  49. void* MasinaOut(void* arg)
  50. {
  51.  
  52. int i, item, index;
  53.  
  54.     index = (int)arg;
  55.     for (i=20; i > 0; i--) {
  56.         int r = rand() % 10;
  57.         sem_wait(&p.full);
  58.         pthread_mutex_lock(&p.mutex);
  59.         item=i;
  60.         item=p.buf[p.out];
  61.         p.out = (p.out+1)%BUFF_SIZE;
  62.         sleep(r);
  63.         printf("\nA iesit masina de pe pozitia %d si a stat %d secunde in parcare\n", index,r);
  64.         fflush(stdout);
  65.         /* Release the buffer */
  66.         pthread_mutex_unlock(&p.mutex);
  67.         /* Increment the number of full slots */
  68.         sem_post(&p.empty);
  69.  
  70.         /* Interleave  producer and consumer execution */
  71.  
  72.        
  73.     }
  74. return NULL;
  75. }
  76.  
  77.  
  78.  
  79. int main(void)
  80. {
  81.         pthread_t idMin, idMout;
  82.     int index;
  83.  
  84.     sem_init(&p.full, 0, 0);
  85.     sem_init(&p.empty, 0, BUFF_SIZE);
  86.     pthread_mutex_init(&p.mutex, NULL);
  87.     for (index = 0; index < 15; index++)
  88.     {
  89.         /* Create a new producer */
  90.         pthread_create(&idMin, NULL, MasinaIn, (void*)index);
  91.     }
  92.     /*create a new Consumer*/
  93.     for(index=0; index<5; index++)
  94.     {
  95.         pthread_create(&idMout, NULL, MasinaOut, (void*)index);
  96.     }
  97.  
  98.  
  99.  
  100.     pthread_exit(NULL);
  101. }


Learn More :