Advertisement
desdemona

Untitled

Apr 13th, 2013
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.34 KB | None | 0 0
  1. #include <pthread.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. #include <time.h>
  6. pthread_mutex_t blokada = PTHREAD_MUTEX_INITIALIZER;
  7.  
  8. const int n=1000;
  9. char bufor[1000];
  10. char lemurowy_bufor[1000];
  11. int buf_poczatek=0;
  12. int buf_dlugosc=0;
  13. int pocz=0;
  14. int dlug=0;
  15. int koniec=0;
  16.  
  17. int push(char x)
  18. {
  19.     if(buf_dlugosc>=n)
  20.         return -5;
  21.     //bufor pelny
  22.    
  23.     buf_dlugosc++;
  24.     bufor[(buf_dlugosc+buf_poczatek-1)%n]=x;
  25.     return 0;
  26. }
  27.  
  28. char pop()
  29. {
  30.     char x = bufor[buf_poczatek];
  31.     buf_poczatek+=1;
  32.     buf_dlugosc-=1;
  33.     return x;
  34. }
  35.  
  36. int lemurowy_push(char x)
  37. {
  38.     if(dlug>=n)
  39.         return -5;
  40.     //bufor pelny
  41.    
  42.     dlug++;
  43.     lemurowy_bufor[(dlug+pocz-1)%n]=x;
  44.     return 0;
  45. }
  46.  
  47. char lemurowy_pop()
  48. {
  49.     char x = bufor[pocz];
  50.     pocz+=1;
  51.     dlug-=1;
  52.     return x;
  53. }
  54.  
  55. void *hodowlaLemurow(void *arg) {
  56.     char litera;
  57.     printf("hodowla lemurów wystartowała\n");
  58.     while(1)
  59.     {
  60.         if(koniec==1)
  61.             break;
  62.        
  63.         if(buf_dlugosc>=1000)
  64.         {
  65.             printf("nie ma miejsca na lemury\n");
  66.         }
  67.         else
  68.         {
  69.             //generujemy jakiekolwiek litery;
  70.             litera=(rand()%26)+65;
  71.             pthread_mutex_lock(&blokada);
  72.             push(litera);
  73.             pthread_mutex_unlock(&blokada);
  74.         }
  75.        
  76.         //przepisywanie bufora na lemurowy_bufor
  77.         pthread_mutex_lock(&blokada);
  78.         litera = pop();
  79.        
  80.         if(litera == 'L' || litera == 'E' || litera == 'M' || litera == 'U' || litera == 'R')
  81.         {
  82.             lemurowy_push(litera);
  83.         }
  84.         pthread_mutex_unlock(&blokada);
  85.     }
  86.     printf("kończę z produkcją bo LEMUR odnaleziony\n");
  87.     pthread_exit(NULL);
  88. }
  89.  
  90. void *poszukiwaczLemurow(void *arg)
  91. {
  92.     char litera;
  93.     char poszukiwana = 'L';
  94.     printf("poszukiwacz lemurow zostal uruchomiony\n");
  95.     while(1)
  96.     {
  97.         if(dlug>=5)
  98.         {
  99.         printf("ilosc liter w lemurowym buforze wystarczajaca do rozpoczecia poszukiwan \n");
  100.         pthread_mutex_lock(&blokada);
  101.         litera = lemurowy_pop();
  102.         pthread_mutex_unlock(&blokada);
  103.        
  104.         switch(litera)
  105.         {
  106.             case 'L':
  107.             {
  108.                 if(poszukiwana == 'L')
  109.                     poszukiwana = 'E';
  110.                 else
  111.                     poszukiwana = 'L';
  112.                 break;
  113.             }
  114.             case 'E':
  115.             {
  116.                 if(poszukiwana == 'E')
  117.                     poszukiwana = 'M';
  118.                 else
  119.                     poszukiwana = 'L';
  120.                 break;
  121.             }          
  122.             case 'M':
  123.             {
  124.                 if(poszukiwana == 'M')
  125.                     poszukiwana = 'U';
  126.                 else
  127.                     poszukiwana = 'L';
  128.                 break;
  129.             }          
  130.             case 'U':
  131.             {
  132.                 if(poszukiwana == 'U')
  133.                     poszukiwana = 'R';
  134.                 else
  135.                     poszukiwana = 'L';
  136.                 break;
  137.             }
  138.             case 'R':
  139.             {
  140.                 if(poszukiwana == 'R')
  141.                 {
  142.                     printf("OMG!!!\nLEMUR ODNALEZIONY!!\n");
  143.                     koniec=1;
  144.                 }
  145.                 else
  146.                     poszukiwana = 'L';
  147.                 break;
  148.             }
  149.         }
  150.         }
  151.         else
  152.             printf("malo lemurow\n");
  153.         if(koniec==1)
  154.             break;
  155.     }
  156.     pthread_exit(NULL);
  157. }
  158.  
  159. int main(void) {
  160.     printf("poszukiwacz lemurów, wersja nieskończonosc\n");
  161.     pthread_t hodowla;
  162.     pthread_t poszukiwacz;
  163.     srand(time(NULL));
  164.  
  165.   //if ( pthread_create( &hodowla, NULL, hodowlaLemurow, NULL) ) {
  166.   //      printf("błąd przy tworzeniu wątku\n.");
  167.   //      abort();
  168.   //}
  169.  
  170.    // if ( pthread_create( &poszukiwacz, NULL, poszukiwaczLemurow, NULL) ) {
  171.    //     printf("błąd przy tworzeniu wątku\n.");
  172.     //    abort();
  173.        
  174.         pthread_create( &hodowla, NULL, hodowlaLemurow, NULL);
  175.         pthread_create( &poszukiwacz, NULL, poszukiwaczLemurow, NULL);
  176.         pthread_join(hodowla, NULL);
  177.         pthread_join(poszukiwacz, NULL);
  178.        
  179.   return 0;
  180.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement