Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.35 KB | None | 0 0
  1. /*
  2. Meno:
  3. Datum:
  4.  
  5. Simulujte nasledujucu situaciu. V kmeni su dve kasty: lovci (6 lovcov) a zberaci (12 zberacov). Uctievaju bozstvo, ktoremu chodia davat dary do chramu. Lovec lovi zver nejaky cas (v simulacii 6s) a potom ide do chramu dat cast ulovku ako dar bozstvu, co tiez trva nejaky cas (v simulacii 2s). Zberac zbiera plody nejaky cas (v simulacii 4s) a potom ide do chramu dat cast plodov bozstvu, co tiez trva nejaky cas (v simulacii 1s). Cela simulacia nech trva 30s.
  6.  
  7. 1. Doplnte do programu pocitadlo pocitajuce, kolko krat bozstvu dali dar lovci a kolko krat zberaci. [2b]
  8.  
  9. 2. Zabezpecte, aby do chramu sucasne mohli vojst maximalne dvaja lovci alebo styria zberaci, iba prislusnici jednej kasty naraz. Ak je pred chramom rad, zabezpecte spravodlivy pristup (kasty su si rovnocenne). [5b]
  10.  
  11. 3. Osetrite v programe spravne ukoncenie simulacie po uplynuti stanoveneho casu. [3b]
  12.  
  13. Poznamky:
  14. - na synchronizaciu pouzite iba mutexy, podmienene premenne alebo semafory
  15. - nespoliehajte sa na uvedene casy, simulacia by mala fungovat aj s inymi casmi
  16. - build (console): gcc lovci_a_zberaci.c -o lovci_a_zberaci -lpthread
  17. */
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <pthread.h>
  22. #include <semaphore.h>
  23. #include <unistd.h>
  24.  
  25. // signal na zastavenie simulacie
  26. int stoj = 0;
  27.  
  28. pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
  29. pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
  30.  
  31. int lovci   = 0;
  32. int zberaci = 0;
  33. int lovci_darov   = 0;
  34. int zberaci_darov = 0;
  35.  
  36. // lovec
  37. void lov(int lovec_id) {
  38.     printf("[LOVEC %d] - je na love... \n", lovec_id);
  39.  
  40.     sleep(6);
  41. }
  42.  
  43. void dar_lov(int lovec_id) {
  44.     pthread_mutex_lock(&mut);
  45.  
  46.     while (lovci >= 2 || zberaci != 0)
  47.         pthread_cond_wait(&cond, &mut);
  48.  
  49.     lovci++;
  50.  
  51.     printf("[LOVEC %d] - daruje ulovok... \n", lovec_id);
  52.     sleep(2);
  53.  
  54.     lovci_darov++;
  55.  
  56.     lovci--;
  57.  
  58.     pthread_cond_broadcast(&cond);
  59.  
  60.     pthread_mutex_unlock(&mut);
  61. }
  62.  
  63. void *lovec(void *ptr) {
  64.     int lovec_id = (int *) ptr;
  65.  
  66.     while(!stoj) {
  67.         lov(lovec_id);
  68.         dar_lov(lovec_id);
  69.     }
  70.  
  71.     pthread_exit(0);
  72. }
  73.  
  74. // zberac
  75. void zber(int zberac_id) {
  76.     printf("[ZBERAC %d] - je na zbere... \n", zberac_id);
  77.  
  78.     sleep(4);
  79. }
  80.  
  81. void dar_zber(int zberac_id) {
  82.     pthread_mutex_lock(&mut);
  83.  
  84.     while (zberaci >= 3 || lovci != 0)
  85.         pthread_cond_wait(&cond, &mut);
  86.  
  87.     zberaci++;
  88.  
  89.     printf("[ZBERAC %d] - daruje zber... \n", zberac_id);
  90.     sleep(1);
  91.  
  92.     zberaci_darov++;
  93.  
  94.     zberaci--;
  95.  
  96.     pthread_cond_broadcast(&cond);
  97.  
  98.     pthread_mutex_unlock(&mut);
  99. }
  100.  
  101. void *zberac(void *ptr) {
  102.     int zberac_id = (int *) ptr;
  103.  
  104.     // pokial nie je zastaveny
  105.     while(!stoj) {
  106.         zber(zberac_id);
  107.         dar_zber(zberac_id);
  108.     }
  109.  
  110.     pthread_exit(0);
  111. }
  112.  
  113. int main(void) {
  114.     int i;
  115.  
  116.     pthread_t lovci[6];
  117.     pthread_t zberaci[12];
  118.  
  119.     for (i=0;i<6;i++) pthread_create( &lovci[i], NULL, &lovec, (void *) i);
  120.     for (i=0;i<12;i++) pthread_create( &zberaci[i], NULL, &zberac, (void *) i);
  121.  
  122.     sleep(30);
  123.     stoj = 1;
  124.  
  125.     pthread_cond_broadcast(&cond);
  126.  
  127.     for (i=0;i<6;i++) pthread_join( lovci[i], NULL);
  128.     for (i=0;i<12;i++) pthread_join( zberaci[i], NULL);
  129.  
  130.     printf("\n==========================\n");
  131.     printf("Lovci darovali: %d\n", lovci_darov);
  132.     printf("Zberaci darovali: %d\n", zberaci_darov);
  133.  
  134.     exit(EXIT_SUCCESS);
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement