Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 3.59 KB | None | 0 0
  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. struct data{
  6.     int*pole;
  7.    volatile  int velkost;
  8.    volatile  int obsadene;
  9.    volatile  int hornyInterval;
  10.    volatile  int dolnyInterval;
  11.     pthread_cond_t *polePlne;
  12.     pthread_cond_t *poleNiejePlne;
  13.     pthread_mutex_t* mutex;
  14. };
  15. void* thread2_main(void* pdata){
  16.      struct data* data = (struct data*) pdata;
  17.          while(1){
  18.          int fibonacci = 0;
  19.          int first = 0;
  20.          int second = 1;
  21.          int next;
  22.           pthread_mutex_lock(data->mutex);
  23.           // overi ci nieje pole prazdne
  24.          if(data->obsadene < 0){
  25.           pthread_cond_wait(data->polePlne,data->mutex);
  26.          }
  27.          //generuje fibonacciho postupnost
  28.          for(int i = 0; i < data->hornyInterval;i++){
  29.              if(i <= 1){
  30.                  fibonacci = i;
  31.              }else{
  32.                  fibonacci = first + second;
  33.                  first = second;
  34.                  second = fibonacci;
  35.                  // porovnanie ci fibbonaciho cislo nieje vacsie ako cislo v pol
  36.                  if(fibonacci > data->pole[data->obsadene]) {
  37.                    printf("neni Fibonacciho\n");
  38.                    data->obsadene--;
  39.                    printf("%d \n",data->obsadene);
  40.                    pthread_mutex_unlock(data->mutex);
  41.                    pthread_cond_signal(data->poleNiejePlne);
  42.                    // iba pre spomalenie aby som to mohol odkontrolovat
  43.                    //sleep(1);
  44.                    break;
  45.                  }
  46.                  //porovnava aktualne fibonacciho cislo s cislom v poli ak su ro
  47.                  if(fibonacci == data->pole[data->obsadene]){
  48.                   printf("fibonacciho cislo %d \n", data->pole[data->obsadene]);
  49.                   data->obsadene--;
  50.                   printf("%d \n",data->obsadene);
  51.                   pthread_mutex_unlock(data->mutex);
  52.                   pthread_cond_signal(data->poleNiejePlne);
  53.                   // iba pre spomalenie aby som to mohol odkontrolovat
  54.  
  55.                   //sleep(1);
  56.                  }
  57.              }
  58.          }
  59.          }
  60.  
  61. }
  62. void* thread1_main(void* pdata){
  63.     struct data* data = (struct  data*) pdata;
  64.  
  65.     while(1){
  66.       // nasada na rand aby generoval furt ine cisla
  67.         srand(time(NULL));
  68.         pthread_mutex_lock(data->mutex);
  69.         //ak je plne  pole tak caka pokial sa miesto v poli neuvolni ak ano pokr
  70.         if(data->obsadene == (data->velkost -1 )){
  71.             pthread_cond_wait(data->poleNiejePlne,data->mutex);
  72.         }
  73.         //generator nahodnich cisel
  74.         int r = (rand()%(data->hornyInterval - data->dolnyInterval)) + data->dolnyInterval;
  75.         data->obsadene++;
  76.         printf("generator %d \n",r);
  77.         data->pole[data->obsadene] = r;
  78.         pthread_mutex_unlock(data->mutex);
  79.         pthread_cond_signal(data->polePlne);
  80.         // iba pre spomalenie aby som to mohol odkontrolovat
  81.         //sleep(1);
  82.  
  83.     }
  84. }
  85. int main(){
  86.     pthread_cond_t cond1,cond2;
  87.     pthread_cond_init(&cond1,NULL);
  88.     pthread_cond_init(&cond2,NULL);
  89.     pthread_mutex_t mutex;
  90.     pthread_mutex_init(&mutex,NULL);
  91.     struct data pole = {NULL,10,-1,20,1,&cond1,&cond2,&mutex};
  92.     pole.pole = malloc(sizeof(int) * pole.velkost);
  93.     pthread_t thread1,thread2;
  94.     pthread_create(&thread1,NULL,&thread1_main,&pole);
  95.     pthread_create(&thread2,NULL,&thread2_main,&pole);
  96.     pthread_join(thread1,NULL);
  97.     pthread_join(thread2,NULL);
  98.     pthread_mutex_destroy(&mutex);
  99.     pthread_cond_destroy(&cond1);
  100.     pthread_cond_destroy(&cond2);
  101.     free(pole.pole);
  102.  
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement