Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.18 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <pthread.h>
  3. #include <stdio.h>
  4. #include <stdlib.h> //importujemy stad funkcje malloc
  5.  
  6.  
  7. #define THREADS 2
  8. pthread_t p_thread[THREADS];
  9.  
  10. struct arg_struct //struktura do funkcji watku
  11. {
  12.     int arg1;
  13.     int arg2;
  14. };
  15.  
  16. void *Newton(void *arguments) //argumentem jest wskaznik na strukture
  17. {
  18.     struct arg_struct *argsPassed = (struct arg_struct *)arguments;
  19.     //tym nie alokujemy zadnej pamieci tylko rzutujemy zeby mozna bylo go uzywac   
  20.     int n = argsPassed->arg1;
  21.     int k = argsPassed->arg2;
  22.  
  23.     if((k==0) || (k==n)) //zwracamy int zamieniony na (void*)
  24.     {
  25.         int output=1;
  26.         return (void*)output;
  27.     }
  28.     else
  29.     {
  30.         struct arg_struct *args1= malloc(sizeof(struct arg_struct));//alokacja pamieci dla struktury dla pierwszej funkcji ktora bedzie wywolana rekurencyjnie
  31.         struct arg_struct *args2= malloc(sizeof(struct arg_struct));//jak wyzej tylko dla drugiej funkcji
  32.  
  33.         args1->arg1 = argsPassed->arg1 - 1;//przypisanie odpowiednich wartosci
  34.         args1->arg2 = argsPassed->arg2 - 1;
  35.         args2->arg1 = argsPassed->arg1 - 1;
  36.         args2->arg2 = argsPassed->arg2;
  37.  
  38.         int output = (void*)((int)Newton((void*)args1) + (int)Newton((void*)args2));//przekazujemy wskazniki na struktury a nie same struktury jako argumenty!!
  39.         //dlatego wczesniej zdefiniowalismy typy wskaznikowe(na poczatku else'a)
  40.         free(args1);//zwalniamy pamiec po strukturach by zapobiec wyciekowi pamieci
  41.         free(args2);
  42.  
  43.         return (void*)output; //Zwracamy int zamienionego na void*
  44.  
  45.     }
  46.  
  47. }
  48.  
  49. void *loading(void *varg){ //funkcja literuje tekst wejsciowy, podczas wykonywania funkcji Newton
  50.     char x[]  = "kamil";
  51.     printf("Ładowanie: ");
  52.     for(int i=0;;i++){
  53.         printf("%c ",x[i%5]);
  54.         fflush(stdout);    
  55.         usleep(300000);    
  56.     }
  57.  
  58. }
  59.  
  60. int main()
  61. {
  62.     struct arg_struct *args;
  63.     args->arg1 = 45; //n
  64.     args->arg2 = 7; //k
  65.     void *wynik;
  66.     pthread_t thread_id1; //tworzymy dwa watki, ktore wykonuja nasze dwie funkcje
  67.     pthread_t thread_id2;
  68.     pthread_create(&thread_id2, NULL, Newton, (void *)args);
  69.     pthread_create(&thread_id1, NULL, loading, NULL);
  70.     pthread_join(thread_id2,&wynik);
  71.     pthread_cancel(thread_id1);
  72.  
  73.     printf("Wynik to %lld \n", (long long int)wynik);//otrzymany wynik
  74.     return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement