Posted By

akirashimosoeda on 03/22/13


Tagged


Versions (?)

pthread


 / Published in: C
 

A little pthread implementation

  1. /*
  2.  *
  3.  * Ordenar una matriz FxC por filas (F) por el metodo de ordenamiento
  4.  * por seleccion, otorgando cada tarea de ordenamiento a un hilo. La
  5.  * cantidad de hilos sera mayor a 1 y no mayor a F.
  6.  *
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <pthread.h>
  12. #include <time.h>
  13. #define SIZE 5
  14.  
  15. typedef struct
  16. {
  17. int *vector;
  18. int size;
  19. } SortArg;
  20.  
  21. int** crearMatriz(int* , int*);
  22. void sort(SortArg*);
  23. void selectionSort(int*, int*);
  24. void swap(int*, int*, int*);
  25. void imprimirMatriz(int**, int*, int*);
  26.  
  27. void main(int argc, char *argv[])
  28. {
  29. int f = SIZE,
  30. c = SIZE,
  31. cantHilos = SIZE-2,
  32. ret;
  33. pthread_t thrd[cantHilos];
  34. SortArg sortArg;
  35. sortArg.size = c;
  36.  
  37. /* Creacion de la matriz */
  38. int** matriz = crearMatriz(&f,&c);
  39.  
  40. imprimirMatriz(matriz,&f,&c);
  41.  
  42. printf("EXPLOTA ACA\n");
  43. /* Para cada fila ordenar por el metodo de seleccion */
  44. int cont = 0,
  45. i;
  46. while(cont < f){
  47. for(i = 0; i < cantHilos; i++){
  48. if(cont < f){
  49. printf("thrd[%d]\n", i);
  50. sortArg.vector = matriz[cont];
  51.  
  52. ret = pthread_create(&thrd[i], NULL, (void *)sort, (void *)&sortArg);
  53. if(ret){
  54. perror("pthread_create: sort");
  55. exit(EXIT_FAILURE);
  56. }
  57. cont++;
  58. printf("CONT:%d\n", cont);
  59. pthread_join(thrd[i], NULL);
  60. }
  61. }
  62. }
  63.  
  64. imprimirMatriz(matriz,&f,&c);
  65. exit(EXIT_SUCCESS);
  66. }
  67.  
  68. /* Creacion de una matriz fxc **/
  69.  
  70. int** crearMatriz(int *f, int *c)
  71. {
  72. srand(time(NULL));
  73. int i, j;
  74. /* Reserva espacio de memoria para la matriz */
  75. int** matriz= (int**)malloc((*f)*sizeof(int*));
  76. for(i = 0; i < *f; i++){
  77. matriz[i] = (int*)malloc((*c)*sizeof(int));
  78. /* Genera numeros aleatorios */
  79. for(j = 0; j < *c; j++){
  80. matriz[i][j] = rand()%10;
  81. }
  82. }
  83. return matriz;
  84. }
  85.  
  86. /* Funcion que llama al algoritmo de ordenacion **/
  87.  
  88. void sort(SortArg *sArg)
  89. {
  90. printf("ENTERED SORT FUNC\n");
  91. selectionSort(sArg->vector, &sArg->size);
  92. }
  93.  
  94. /* Algoritmo de ordenacion por seleccion **/
  95.  
  96. void selectionSort(int *vec, int* t)
  97. {
  98. int i, j, k, minor, swapIt;
  99. for(i = 0; i < *t-1; i++){
  100. minor = vec[i];
  101. swapIt = 0;
  102. for(j = (i+1); j < *t; j++){
  103. if(minor > vec[j]){
  104. k = j;
  105. minor = vec[j];
  106. swapIt = 1;
  107. }
  108. }
  109. if(swapIt)
  110. swap(vec, &i, &k);
  111. }
  112. }
  113.  
  114. void swap(int *vec, int *ini, int *end)
  115. {
  116. int aux = vec[*ini];
  117. vec[*ini] = vec[*end];
  118. vec[*end] = aux;
  119. }
  120.  
  121. /***/
  122.  
  123. void imprimirMatriz(int **mat, int *f, int *c)
  124. {
  125. int i, j;
  126. for(i = 0; i < *f; i++){
  127. for(j = 0; j < *c; j++)
  128. printf("%d ", mat[i][j]);
  129. printf("\n");
  130. }
  131. printf("\n");
  132. }

Report this snippet  

You need to login to post a comment.