Advertisement
Guest User

Untitled

a guest
Dec 10th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.73 KB | None | 0 0
  1. #include <pthread.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <stdio.h>
  6.  
  7. #define KAPACITA 20
  8. #define VSTUPY 4
  9.  
  10. #define TRUE 1
  11. #define FALSE 0
  12.  
  13. #define PRICHOD_MIN 1
  14. #define PRICHOD_MAX 6
  15. #define ODCHOD_MIN 5
  16. #define ODCHOD_MAX 10
  17.  
  18. struct zdielane_data
  19. {
  20.     volatile unsigned* parkovisko;
  21.     volatile unsigned index;
  22.  
  23.     pthread_mutex_t* mutex;
  24.     pthread_cond_t* cond;
  25. };
  26.  
  27. void cakaj_v_rozsahu(unsigned min, unsigned max)
  28. {
  29.     unsigned rozsah = max - min + 1;
  30.     unsigned pocet_sekund = rand() % rozsah + min;
  31.  
  32.     sleep(pocet_sekund);
  33. }
  34.  
  35. void* function_generuj(void* zdata)
  36. {
  37.     struct zdielane_data* data = (struct zdielane_data*) zdata;
  38.    
  39.     printf("ZACIATOK GENERUJ\n");
  40.  
  41.     while (TRUE)
  42.     {
  43.         cakaj_v_rozsahu(PRICHOD_MIN, PRICHOD_MAX);
  44.  
  45.         pthread_mutex_lock(data->mutex);
  46.         if (data->index < KAPACITA)
  47.         {
  48.             data->parkovisko[data->index++] = TRUE;
  49.             printf("Zaparkovane %u. auto.\n", data->index);
  50.         }
  51.         else
  52.         {
  53.             printf("ach jaj\n");
  54.             pthread_cond_signal(data->cond);
  55.         }
  56.         pthread_mutex_unlock(data->mutex);
  57.     }
  58.  
  59.     return NULL;
  60. }
  61.  
  62. void* function_vyprazdnuj(void* zdata)
  63. {
  64.     struct zdielane_data* data = (struct zdielane_data*) zdata;
  65.  
  66.     printf("ZACIATOK VYPRAZDNUJ\n");
  67.  
  68.     while (TRUE)
  69.     {
  70.         pthread_mutex_lock(data->mutex);
  71.         while (data->index < KAPACITA)
  72.         {
  73.             pthread_cond_wait(data->cond, data->mutex);
  74.         }
  75.         pthread_mutex_unlock(data->mutex);
  76.  
  77.         cakaj_v_rozsahu(ODCHOD_MIN, ODCHOD_MAX);
  78.  
  79.         pthread_mutex_lock(data->mutex);
  80.         memset((void*) data->parkovisko, 0, sizeof(unsigned));
  81.         data->index = 0;
  82.         printf("Parkovisko sa vyprazdnilo\n");
  83.         pthread_mutex_unlock(data->mutex);
  84.     }
  85.  
  86.     return NULL;
  87. }
  88.  
  89. int main(int argc, char** argv)
  90. {
  91.     pthread_mutex_t mutex;
  92.     pthread_mutex_init(&mutex, NULL);
  93.  
  94.     pthread_cond_t cond;
  95.     pthread_cond_init(&cond, NULL);
  96.  
  97.     struct zdielane_data data = {
  98.         (unsigned*) malloc(KAPACITA * sizeof(unsigned)),
  99.         0,
  100.         &mutex,
  101.         &cond
  102.     };
  103.  
  104.     pthread_t threadsVstup[VSTUPY];
  105.     for (int i = 0; i < VSTUPY; i++)
  106.     {
  107.         pthread_create(&threadsVstup[i], NULL, &function_generuj, &data);
  108.     }
  109.  
  110.     pthread_t threadVystup;
  111.     pthread_create(&threadVystup, NULL, &function_vyprazdnuj, &data);
  112.  
  113.     for (int i = 0; i < VSTUPY; i++)
  114.     {
  115.         pthread_join(threadsVstup[i], NULL);
  116.     }
  117.  
  118.     pthread_join(threadVystup, NULL);
  119.  
  120.     pthread_cond_destroy(&cond);
  121.     pthread_mutex_destroy(&mutex);
  122.  
  123.     free((void*) data.parkovisko);
  124.  
  125.     return EXIT_SUCCESS;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement