Advertisement
Guest User

Zad 1 - mutex

a guest
Dec 11th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.89 KB | None | 0 0
  1. #include "stdio.h"
  2. #include "unistd.h"
  3. #include "pthread.h"
  4. #include "stdlib.h"
  5. #include "errno.h"
  6. #include "limits.h"
  7. #include "math.h"
  8. #include "semaphore.h"
  9.  
  10. pthread_mutex_t mut[11];
  11.  
  12. //Funkcja obliczająca rekurencyjnie n-tą liczbę Fibonacciego
  13. double wyrazEx(double x, unsigned int i);
  14.  
  15. void *threadEx(void *arg);
  16. double silnia (double n)
  17. {
  18. if (n <= 1) return 1;
  19. else return n*silnia(n-1);
  20. }
  21.  
  22.  
  23. struct argsForThread{
  24.     double x;
  25.     unsigned int i;
  26. };
  27.  
  28.  
  29. double result = 0.0;
  30. int nrWatku = 0;
  31. int main()
  32. {
  33.     double x = 5;
  34.     struct argsForThread argumenty[10];
  35.     double suma = 0.0;
  36.     pthread_t threadId[10];
  37.     pthread_attr_t attrs;
  38.    
  39.     for(int i = 0; i < 11; i++)
  40.     pthread_mutex_init(&mut[i], NULL);
  41.  
  42.     pthread_attr_init(&attrs);
  43.     //pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED );
  44.    
  45.     printf("Podaj X:\n");
  46.     scanf("%lf", &x);
  47.  
  48.     for(int i = 1; i<11; i++)
  49.     pthread_mutex_lock(&mut[i]);
  50.        
  51.     for(int i = 0; i < 10; i++)
  52.     {
  53.         argumenty[i].x = x;
  54.         argumenty[i].i = i;
  55.         pthread_create(&threadId[i], &attrs, threadEx, &argumenty[i]);
  56.         pthread_detach(threadId[i]);
  57.     }
  58.  
  59.     for(int i = 0; i < 10; i++)
  60.     {
  61.         pthread_mutex_lock(&mut[0]);
  62.             suma += result;
  63.             printf("a%d = %f\n", nrWatku, result);
  64.         pthread_mutex_unlock(&mut[nrWatku+1]);
  65.     }
  66.  
  67.     printf("Suma = %f\n", suma);
  68.     printf("exp(%f) = %f\n", x, exp(x));
  69. }
  70.  
  71. double wyrazEx(double x, unsigned int i)
  72. {
  73.     double wynik = pow(x, i) / (double)silnia(i);
  74.     return wynik;
  75. }
  76.  
  77. void *threadEx(void *arg)
  78. {
  79.     struct argsForThread *argptr = (struct argsForThread*) arg;
  80.     int num = argptr->i;
  81.     double wynik = wyrazEx(argptr->x, argptr->i);
  82.     pthread_mutex_lock(&mut[num]);
  83.         nrWatku = num;
  84.         result = wynik;
  85.     pthread_mutex_unlock(&mut[0]);
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement