Facebook
From Tinct Cat, 4 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 127
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<pthread.h>
  4. #include<unistd.h>
  5.  
  6. const int ilosc_litrow_do_wypicia=4;
  7. const int ilosc_kufli=1;
  8. const int ilosc_klijentow=2;
  9. const int maksymalny_czas_picia=5;
  10.  
  11. int * kufle;
  12. int ilosc_wolnych_kufli=ilosc_kufli;
  13. pthread_mutex_t sekcja_krytyczna=PTHREAD_MUTEX_INITIALIZER;
  14.  
  15. void* picie_piwa(void* arg){
  16.     int numer_klijenta=(int) arg;
  17.     int kufel=0;
  18.     int ilosc_wypitego_piwa=0;
  19.     int czas_picia=0;
  20.     printf("Klijent numer %d wchodzi do barun",numer_klijenta);
  21.     while(2>1){
  22.         while(kufel==0){
  23.         pthread_mutex_lock(& sekcja_krytyczna);
  24.             if(ilosc_kufli>0){
  25.                 for(int i=0;i<ilosc_kufli;i++){
  26.                     if(kufle[i]!=0){
  27.                         kufel=kufle[i];
  28.                         kufle[i]=0;
  29.                         ilosc_wolnych_kufli--;
  30.                         printf("Klijent numer %d zabrał piwo w kuflu o numerze %dn",numer_klijenta,kufel);
  31.                         break;
  32.                     }  
  33.                 }
  34.             }
  35.         pthread_mutex_unlock(& sekcja_krytyczna);
  36.         }
  37.         czas_picia=(rand()%maksymalny_czas_picia)+1;
  38.         sleep(czas_picia);
  39.         ilosc_wypitego_piwa++;
  40.         pthread_mutex_lock(&sekcja_krytyczna);
  41.         kufle[kufel-1]=kufel;
  42.         ilosc_wolnych_kufli++;
  43.         printf("Klijent numer %d oddał kufel numer %d po czasie %d, wypiłem już %d litrów piwan",numer_klijenta,kufel,czas_picia,ilosc_wypitego_piwa);
  44.         kufel=0;
  45.         pthread_mutex_unlock(&sekcja_krytyczna);
  46.         if(ilosc_wypitego_piwa==ilosc_litrow_do_wypicia){
  47.             break;
  48.         }
  49.     }
  50.     printf("Klijent numer %d zakończył picie na dziśn",numer_klijenta);
  51.     return (NULL);
  52. }
  53.  
  54. int main(){
  55.     printf("Hellon");
  56.     kufle = malloc(sizeof(int)*ilosc_kufli);
  57.     for (int i=1;i<=ilosc_kufli;i++){
  58.         kufle[i-1]=i;
  59.     }
  60.     pthread_t klijeci[ilosc_klijentow];
  61.  
  62.     for (int i=0;i<ilosc_klijentow;i++){
  63.         pthread_create(&klijeci[i], NULL, picie_piwa, (void*)(i+1));
  64.     }
  65.     for (int i=0;i<ilosc_klijentow;i++){
  66.         pthread_join(klijeci[i],NULL);
  67.     }
  68.  
  69.     return 0;
  70. }