Advertisement
desdemona

poszukiwanie lemura.

Apr 14th, 2013
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.95 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.  
  46.         lemurowy_bufor[(dlug+pocz)%n]=x;
  47.         dlug+=1;
  48.         return 0;
  49. }
  50.  
  51. char lemurowy_pop()
  52. {
  53.         char x = 'e';
  54.         if(dlug>0)
  55.         {
  56.         x = 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.                 pthread_mutex_unlock(&blokada);
  98.                 printf("%c", litera);
  99.                 switch(litera)
  100.                 {
  101.                         case 'L':
  102.                         {
  103.                                 if(poszukiwana == 'L')
  104.                                         poszukiwana = 'E';
  105.                                 else
  106.                                         poszukiwana = 'L';
  107.                                 break;
  108.                         }
  109.                         case 'E':
  110.                         {
  111.                                 if(poszukiwana == 'E')
  112.                                         poszukiwana = 'M';
  113.                                 else
  114.                                         poszukiwana = 'L';
  115.                                 break;
  116.                         }                      
  117.                         case 'M':
  118.                         {
  119.                                 if(poszukiwana == 'M')
  120.                                         poszukiwana = 'U';
  121.                                 else
  122.                                         poszukiwana = 'L';
  123.                                 break;
  124.                         }                      
  125.                         case 'U':
  126.                         {
  127.                                 if(poszukiwana == 'U')
  128.                                         poszukiwana = 'R';
  129.                                 else
  130.                                         poszukiwana = 'L';
  131.                                 break;
  132.                         }
  133.                         case 'R':
  134.                         {
  135.                                 if(poszukiwana == 'R')
  136.                                 {
  137.                                         printf("OMG!!!\nLEMUR ODNALEZIONY!!\n");
  138.                                         koniec=1;
  139.                                 }
  140.                                 else
  141.                                         poszukiwana = 'L';
  142.                                 break;
  143.                         }
  144.                 }
  145.                 }
  146.                 //else
  147.                         //printf("malo lemurow\n");
  148.  
  149.         }
  150.         printf("kończę z produkcją bo LEMUR odnaleziony\n");
  151.         pthread_exit(NULL);
  152. }
  153.  
  154. void *przepisywaczLemurow(void *arg)
  155. {
  156.         char litera;
  157.         printf("przepisywacz lemurow zostal uruchomiony\n");
  158.         //przepisywanie bufora na lemurowy_bufor
  159.         while(1)
  160.         {
  161.         if(koniec == 1)
  162.                 break;
  163.                
  164.         pthread_mutex_lock(&blokada);
  165.         if(buf_dlugosc>0)
  166.         {
  167.         litera = pop();
  168.                
  169.         if(litera == 'L' || litera == 'E' || litera == 'M' || litera == 'U' || litera == 'R')
  170.         {
  171.                         lemurowy_push(litera);
  172.         }
  173.         }
  174.         pthread_mutex_unlock(&blokada);
  175.        
  176.        
  177.         }
  178.        
  179.         printf("przepisywanie zakonczone, LEMUR odnaleziony");
  180.         pthread_exit(NULL);
  181. }
  182.  
  183. int main(void) {
  184.         printf("poszukiwacz lemurów, wersja nieskończonosc\n");
  185.         pthread_t hodowla;
  186.         pthread_t przepisywacz;
  187.         srand(time(NULL));
  188.  
  189.   //if ( pthread_create( &hodowla, NULL, hodowlaLemurow, NULL) ) {
  190.   //      printf("błąd przy tworzeniu wątku\n.");
  191.   //      abort();
  192.   //}
  193.  
  194.    // if ( pthread_create( &poszukiwacz, NULL, poszukiwaczLemurow, NULL) ) {
  195.    //     printf("błąd przy tworzeniu wątku\n.");
  196.     //    abort();
  197.        
  198.         pthread_create( &hodowla, NULL, hodowlaLemurow, NULL);
  199.         //sleep(1);
  200.         pthread_create( &przepisywacz, NULL, przepisywaczLemurow, NULL);
  201.         pthread_join(hodowla, NULL);
  202.         pthread_join(przepisywacz, NULL);
  203.        
  204.   return 0;
  205.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement