Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #include <pthread.h>
- #include <stdio.h>
- #include <stdlib.h> //importujemy stad funkcje malloc
- #define THREADS 2
- pthread_t p_thread[THREADS];
- struct arg_struct //struktura do funkcji watku
- {
- int arg1;
- int arg2;
- };
- void *Newton(void *arguments) //argumentem jest wskaznik na strukture
- {
- struct arg_struct *argsPassed = (struct arg_struct *)arguments;
- //tym nie alokujemy zadnej pamieci tylko rzutujemy zeby mozna bylo go uzywac
- int n = argsPassed->arg1;
- int k = argsPassed->arg2;
- if((k==0) || (k==n)) //zwracamy int zamieniony na (void*)
- {
- int output=1;
- return (void*)output;
- }
- else
- {
- struct arg_struct *args1= malloc(sizeof(struct arg_struct));//alokacja pamieci dla struktury dla pierwszej funkcji ktora bedzie wywolana rekurencyjnie
- struct arg_struct *args2= malloc(sizeof(struct arg_struct));//jak wyzej tylko dla drugiej funkcji
- args1->arg1 = argsPassed->arg1 - 1;//przypisanie odpowiednich wartosci
- args1->arg2 = argsPassed->arg2 - 1;
- args2->arg1 = argsPassed->arg1 - 1;
- args2->arg2 = argsPassed->arg2;
- int output = (void*)((int)Newton((void*)args1) + (int)Newton((void*)args2));//przekazujemy wskazniki na struktury a nie same struktury jako argumenty!!
- //dlatego wczesniej zdefiniowalismy typy wskaznikowe(na poczatku else'a)
- free(args1);//zwalniamy pamiec po strukturach by zapobiec wyciekowi pamieci
- free(args2);
- return (void*)output; //Zwracamy int zamienionego na void*
- }
- }
- void *loading(void *varg){ //funkcja literuje tekst wejsciowy, podczas wykonywania funkcji Newton
- char x[] = "kamil";
- printf("Ładowanie: ");
- for(int i=0;;i++){
- printf("%c ",x[i%5]);
- fflush(stdout);
- usleep(300000);
- }
- }
- int main()
- {
- struct arg_struct *args;
- args->arg1 = 45; //n
- args->arg2 = 7; //k
- void *wynik;
- pthread_t thread_id1; //tworzymy dwa watki, ktore wykonuja nasze dwie funkcje
- pthread_t thread_id2;
- pthread_create(&thread_id2, NULL, Newton, (void *)args);
- pthread_create(&thread_id1, NULL, loading, NULL);
- pthread_join(thread_id2,&wynik);
- pthread_cancel(thread_id1);
- printf("Wynik to %lld \n", (long long int)wynik);//otrzymany wynik
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement