Advertisement
Guest User

Untitled

a guest
Jun 15th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.98 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <time.h>
  4. #include <unistd.h>
  5. #include <stdlib.h>
  6. #include <sys/time.h>
  7. /* Time in seconds from some point in the past */
  8.  
  9. /*****************************************************************/
  10.  
  11. double dwalltime()
  12. {
  13.     double sec;
  14.     struct timeval tv;
  15.  
  16.     gettimeofday(&tv, NULL);
  17.     sec = tv.tv_sec + tv.tv_usec / 1000000.0;
  18.     return sec;
  19. }
  20.  
  21. //FIN de calcular tiempo
  22.  
  23. int N = 4;
  24. /*Variables pertenecientes a los hilos*/
  25. int P = 0;
  26. pthread_mutex_t s = PTHREAD_MUTEX_INITIALIZER;
  27. /*Variables a reemplazar por argumentos*/
  28. int Min = 999;
  29. int Max = -1;
  30. int check = 1;
  31.  
  32. /*matriz A por fila y por columnas*/
  33. int *A,*RESULT;
  34. double timetick;
  35. //funcion para poder visualizar matriz
  36. void vermatriz(int *m, int modo)
  37. {
  38.     /*LE DA EL FORMATO A LA COLUMNA*/
  39.     printf(" \t Columna |\t");
  40.     for (int k = 0; k < N; k++)
  41.     {
  42.         printf(" %d \t", k);
  43.     }
  44.     printf("\n");
  45.     printf("\t -------------------------------------------");
  46.     printf("\n");
  47.  
  48.     printf("\t");
  49.     for (int i = 0; i < N; i++)
  50.     {
  51.         printf(" Fila %d  |\t", i);
  52.         for (int j = 0; j < N; j++)
  53.         {
  54.             if (modo == 0)
  55.             {
  56.                 printf(" %d \t", m[i * N + j]); //recorre por fila
  57.             }
  58.             else
  59.             {
  60.                 printf(" %d \t", m[i + j * N]); //recorre por columna
  61.             }
  62.         }
  63.         printf("\n \t");
  64.     }
  65. }
  66.  
  67. void *Funcion_maxmin(void *arg)
  68. {
  69.  
  70.     int tid = *(int *)arg;
  71.     int ini = tid * (P);
  72.     int fin = (tid + 1) * (P);
  73.     int min = 999;
  74.     int max = -1; // es mejor calcular los minimos y maximos de manera local
  75.     // y al final pasarselos a una variable global minimo y maximo. Esto es debido a la rapidez
  76.     printf(" \n ");
  77.     printf(" ESTOY EN LA FUNCION DE H %d", tid);
  78.     printf(" \n ");
  79.     printf(" INI %d FIN  %d", ini, fin);
  80.     printf(" \n ");
  81.  
  82.     for (int i = ini; i < fin; i++)
  83.     {
  84.         for (int j = ini; j < fin; j++)
  85.         {
  86.             if (A[i * fin + j] < min)
  87.                 min = A[i * N + j];
  88.             if (A[i * fin + j] > max)
  89.                 max = A[i * N + j];
  90.         }
  91.     }
  92.     // se lo pasamos a la variable global
  93.  
  94.     pthread_mutex_lock(&s);
  95.     if (min < Min)
  96.         Min = min;
  97.     pthread_mutex_unlock(&s);
  98.  
  99.     pthread_mutex_lock(&s);
  100.     if (max > Max)
  101.         Max = max;
  102.  
  103.     pthread_mutex_unlock(&s);
  104.     pthread_exit(NULL); //finalizacion del hilo
  105. }
  106.  
  107. int main(int argc, char *argv[])
  108. {
  109.     int H = 2; // es un valor por defecto en el caso de que no se
  110.     // introduzca ningun valor por consola.
  111.  
  112.     //Controla los argumentos al programa
  113.     if ((argc != 3) || ((N = atoi(argv[1])) <= 0) || ((H = atoi(argv[2])) <= 0))
  114.     {
  115.         printf("\nUsar: %s n\n  h: cant hilos  \n", argv[0]);
  116.         exit(1);
  117.     }
  118.  
  119.     /*Declarar e inicializaciones*/
  120.     N = atoi(argv[1]); // Inicializa valor de mi arreglo de N elementos
  121.     H = atoi(argv[2]); //incializar valor de hilos
  122.  
  123.     //calculamos la proporcion
  124.     P = N / H;
  125.  
  126.     /*Matriz A original*/
  127.     A = (int *)malloc(N * N * sizeof(int));
  128.  
  129.     RESULT = (int *)malloc(N * N * sizeof(int));
  130.  
  131.     for (int i = 0; i < N; i++)
  132.     {
  133.         for (int j = 0; j < N; j++)
  134.         {
  135.             A[i * N + j] = i;
  136.         }
  137.     }
  138.     vermatriz(A, 0);
  139.     //Reservo memoria para el vector de hilos
  140.     pthread_t *tid = (pthread_t *)(malloc(sizeof(pthread_t) * H)); // por esto me daba error!
  141.     int *threads_ids = (int *)(malloc(sizeof(int) * H));
  142.     pthread_mutex_init(&s, NULL); // inicializacion s
  143.  
  144.     //Realiza el tiempo inicial para la busqueda y calclulo
  145.     timetick = dwalltime();
  146.     for (int t = 0; t < H; t++)
  147.     {
  148.         threads_ids[t] = t;
  149.         pthread_create(&tid[t], NULL, Funcion_maxmin, (void *)&threads_ids[t]);
  150.     }
  151.     for (int t = 0; t < H; t++)
  152.         pthread_join(tid[t], NULL);
  153.     //Destruccion de s
  154.     pthread_mutex_destroy(&s);
  155.  
  156.  
  157.     //Realiza el tiempo iniial para la busqueda y calclulo
  158.     timetick = dwalltime();
  159.     printf("Tiempo en segundos %f\n", dwalltime() - timetick);
  160.  
  161.     if (check)
  162.         printf("Multiplicacion de matrices resultado correcto\n");
  163.     else
  164.         printf("Multiplicacion de matrices resultado erroneo\n");
  165.  
  166.     printf("resultado max es: %d \n", Max);
  167.     printf("resultado min es: %d \n", Min);
  168.  
  169.     /*Matriz A original*/
  170.     free(A);
  171.     free(RESULT);
  172.  
  173.     return (0);
  174. }
  175.  
  176. //NOTA AVERIGUAR POR QUE SE DESBORDA
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement