Advertisement
desdemona

poszukiwanie lemura, które działa

Apr 14th, 2013
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.98 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 = 'e';
  31.         if(buf_dlugosc > 0)
  32.         {
  33.         x = bufor[buf_poczatek];
  34.         buf_poczatek= (buf_poczatek+1)%n;
  35.         buf_dlugosc-=1;
  36.         }
  37.         return x;
  38. }
  39.  
  40. int lemurowy_push(char x)
  41. {
  42.         if(dlug>=n)
  43.                 return -5;
  44.         //bufor pelny
  45.         lemurowy_bufor[(dlug+pocz)%n]=x;
  46.         dlug+=1;
  47.        
  48.         return 0;
  49. }
  50.  
  51. char lemurowy_pop()
  52. {
  53.         char x = 'e';
  54.         if(dlug>0)
  55.         {
  56.         x = lemurowy_bufor[pocz];
  57.         pocz=(pocz+1)%n;
  58.         dlug-=1;
  59.         }
  60.         else
  61.         {
  62.                 printf("lemurowy bufor pusty\n");
  63.         }
  64.         return x;
  65. }
  66.  
  67. void *hodowlaLemurow(void *arg) {
  68.         char litera;
  69.         char poszukiwana = 'L';
  70.         printf("hodowla lemurów wystartowała\n");
  71.         while(1)
  72.         {
  73.                 if(koniec==1)
  74.                         break;
  75.                
  76.                 if(buf_dlugosc>=1000)
  77.                 {
  78.                         //printf("nie ma miejsca na lemury\n");
  79.                 }
  80.                 else
  81.                 {
  82.                         //generujemy jakiekolwiek litery;
  83.                         litera=(rand()%26)+65;
  84.                         //printf("generuje litere %c\n", litera);
  85.                         pthread_mutex_lock(&blokada);
  86.                         push(litera);
  87.                         pthread_mutex_unlock(&blokada);
  88.                 }
  89.                
  90.                 //sleep(20);
  91.                 //puszukiwanie lemura w buforze 2
  92.                 if(dlug>=5)
  93.                 {
  94.                 //printf("ilosc liter w lemurowym buforze wystarczajaca do rozpoczecia poszukiwan \n");
  95.                 pthread_mutex_lock(&blokada);
  96.                 litera = lemurowy_pop();
  97.                 printf("%c", litera);
  98.                 pthread_mutex_unlock(&blokada);
  99.                
  100.                 switch(litera)
  101.                 {
  102.                         case 'L':
  103.                         {
  104.                                 if(poszukiwana == 'L')
  105.                                         poszukiwana = 'E';
  106.                                 else
  107.                                         poszukiwana = 'L';
  108.                                 break;
  109.                         }
  110.                         case 'E':
  111.                         {
  112.                                 if(poszukiwana == 'E')
  113.                                         poszukiwana = 'M';
  114.                                 else
  115.                                         poszukiwana = 'L';
  116.                                 break;
  117.                         }                      
  118.                         case 'M':
  119.                         {
  120.                                 if(poszukiwana == 'M')
  121.                                         poszukiwana = 'U';
  122.                                 else
  123.                                         poszukiwana = 'L';
  124.                                 break;
  125.                         }                      
  126.                         case 'U':
  127.                         {
  128.                                 if(poszukiwana == 'U')
  129.                                         poszukiwana = 'R';
  130.                                 else
  131.                                         poszukiwana = 'L';
  132.                                 break;
  133.                         }
  134.                         case 'R':
  135.                         {
  136.                                 if(poszukiwana == 'R')
  137.                                 {
  138.                                     koniec=1;
  139.                                         printf("\nOMG!!!\nLEMUR ODNALEZIONY!!\n");
  140.                                 }
  141.                                 else
  142.                                         poszukiwana = 'L';
  143.                                 break;
  144.                         }
  145.                 }
  146.                 }
  147.                 //else
  148.                         //printf("malo lemurow\n");
  149.  
  150.         }
  151.         printf("kończę z produkcją bo LEMUR odnaleziony\n");
  152.         pthread_exit(NULL);
  153. }
  154.  
  155. void *przepisywaczLemurow(void *arg)
  156. {
  157.         char litera;
  158.         printf("przepisywacz lemurow zostal uruchomiony\n");
  159.         //przepisywanie bufora na lemurowy_bufor
  160.         while(1)
  161.         {
  162.         if(koniec == 1)
  163.                 break;
  164.                
  165.         pthread_mutex_lock(&blokada);
  166.         if(buf_dlugosc>0)
  167.         {
  168.         litera = pop();
  169.                
  170.         if(litera == 'L' || litera == 'E' || litera == 'M' || litera == 'U' || litera == 'R')
  171.         {
  172.                         lemurowy_push(litera);
  173.         }
  174.         }
  175.         pthread_mutex_unlock(&blokada);
  176.        
  177.        
  178.         }
  179.        
  180.         printf("przepisywanie zakonczone, LEMUR odnaleziony\n");
  181.         pthread_exit(NULL);
  182. }
  183.  
  184. int main(void) {
  185.         printf("poszukiwacz lemurów, wersja nieskończonosc\n");
  186.         pthread_t hodowla;
  187.         pthread_t przepisywacz;
  188.         srand(time(NULL));
  189.  
  190.   //if ( pthread_create( &hodowla, NULL, hodowlaLemurow, NULL) ) {
  191.   //      printf("błąd przy tworzeniu wątku\n.");
  192.   //      abort();
  193.   //}
  194.  
  195.    // if ( pthread_create( &poszukiwacz, NULL, poszukiwaczLemurow, NULL) ) {
  196.    //     printf("błąd przy tworzeniu wątku\n.");
  197.     //    abort();
  198.        
  199.         pthread_create( &hodowla, NULL, hodowlaLemurow, NULL);
  200.         //sleep(1);
  201.         pthread_create( &przepisywacz, NULL, przepisywaczLemurow, NULL);
  202.         pthread_join(hodowla, NULL);
  203.         pthread_join(przepisywacz, NULL);
  204.        
  205.   return 0;
  206.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement