Advertisement
tomasfdel

SO Práctica 2

Apr 5th, 2018
389
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 17.94 KB | None | 0 0
  1. //EJERCICIO 1
  2.  
  3. //Apartado 1
  4. #include <stdio.h>
  5. #include <omp.h>
  6.  
  7. #define N_VISITANTES 1000000
  8.  
  9. int visitantes = 0;
  10.  
  11. int main()
  12. {
  13.   int i;
  14.   #pragma omp parallel num_threads(2)
  15.   for (i=0;i<N_VISITANTES;i++)
  16.     visitantes++;
  17.  
  18.   printf("Hoy hubo %d visitantes!\n", visitantes);
  19.   return 0;
  20. }
  21.  
  22.  
  23. //Apartado 2
  24. #include <stdio.h>
  25. #include <omp.h>
  26.  
  27. #define N_VISITANTES 50
  28. #define N 2
  29.  
  30. int visitantes = 0;
  31. int flag[N];
  32. volatile int turno[N];
  33. int max;
  34.  
  35. void lock(int proceso){
  36.     int i;
  37.     flag[proceso] = 1;
  38.        
  39.     turno[proceso] = ++max;
  40.     flag[proceso] = 0;
  41.     for(i = 0; i < N; i++){
  42.         while(i != proceso && flag[i]!=0);
  43.         while (turno[i] != 0 && (turno[proceso] > turno[i] || (turno[proceso] == turno[i] && proceso > i)));
  44.     }
  45. }
  46.  
  47. void unlock(int proceso){
  48.     turno[proceso] = 0;
  49. }
  50.  
  51. int main()
  52. {
  53.   int i;
  54.   #pragma omp parallel num_threads(N)
  55.   for (i=0;i<N_VISITANTES;i++){
  56.     lock(omp_get_thread_num());
  57.     visitantes++;
  58.     unlock(omp_get_thread_num());
  59.   }
  60.   printf("Hoy hubo %d visitantes!\n", visitantes);
  61.   return 0;
  62. }
  63.  
  64.  
  65.  
  66.  
  67. // EJERCICIO 2
  68. #include <stdio.h>
  69. #include <stdlib.h>
  70. #include <omp.h>
  71. #define N 1000
  72.  
  73. int A[N][N],B[N][N],C[N][N];
  74.  
  75. void mult(int A[N][N], int B[N][N], int C[N][N])
  76. {
  77.     int i, j, k;
  78.     # pragma omp parallel num_threads(N) private(i, j, k)
  79.     {
  80.         k = omp_get_thread_num();
  81.         for (i=0;i<N;i++)
  82.             for (j=0;j<N;j++)
  83.                 C[k][i] += A[k][j]*B[j][i];
  84.     }
  85. }
  86.  
  87. int main()
  88. {
  89.     int i, j;
  90.     for (i=0;i<N;i++)
  91.         for (j=0;j<N;j++) {
  92.             A[i][j] = random() % 10;
  93.             B[i][j] = random() % 10;
  94.         }
  95.     mult(A, B, C);
  96.     return 0;
  97. }
  98.  
  99.  
  100.  
  101.  
  102.  
  103. /*
  104. alumno@pelle010:~/Escritorio$ gcc matrixP.c -fopenmp
  105. alumno@pelle010:~/Escritorio$ time "./a.out"
  106.  
  107. real    0m0.003s
  108. user    0m0.000s
  109. sys 0m0.000s
  110. alumno@pelle010:~/Escritorio$ time "./a.out"
  111.  
  112. real    0m0.003s
  113. user    0m0.000s
  114. sys 0m0.000s
  115. alumno@pelle010:~/Escritorio$ time "./a.out"
  116.  
  117. real    0m0.003s
  118. user    0m0.004s
  119. sys 0m0.000s
  120. alumno@pelle010:~/Escritorio$ gcc matrixP.c -fopenmp
  121. alumno@pelle010:~/Escritorio$ time "./a.out"
  122.  
  123. real    0m0.022s
  124. user    0m0.056s
  125. sys 0m0.000s
  126. alumno@pelle010:~/Escritorio$ gcc matrix.c -o pepe
  127. alumno@pelle010:~/Escritorio$ time "./pepe""
  128. > dddd
  129. > swds
  130. > ^C
  131. alumno@pelle010:~/Escritorio$ time "./pepe"
  132.  
  133. real    0m0.046s
  134. user    0m0.044s
  135. sys 0m0.004s
  136. alumno@pelle010:~/Escritorio$ time "./pepe"
  137.  
  138. real    0m0.046s
  139. user    0m0.044s
  140. sys 0m0.000s
  141. alumno@pelle010:~/Escritorio$ time "./a.out"
  142.  
  143. real    0m0.021s
  144. user    0m0.056s
  145. sys 0m0.004s
  146. alumno@pelle010:~/Escritorio$ time "./pepe"
  147.  
  148. real    0m0.046s
  149. user    0m0.044s
  150. sys 0m0.000s
  151. alumno@pelle010:~/Escritorio$ gcc matrix.c -o pepe
  152. alumno@pelle010:~/Escritorio$ gcc matrixP.c -fopenmp
  153. alumno@pelle010:~/Escritorio$ time "./a.out"
  154.  
  155. real    0m0.162s
  156. user    0m0.600s
  157. sys 0m0.000s
  158. alumno@pelle010:~/Escritorio$ time "./pepe"
  159.  
  160. real    0m0.547s
  161. user    0m0.544s
  162. sys 0m0.000s
  163. alumno@pelle010:~/Escritorio$ gcc matrixP.c -fopenmp
  164. alumno@pelle010:~/Escritorio$ gcc matrix.c -o pepe
  165. alumno@pelle010:~/Escritorio$ time "./pepe"
  166. ^[[A^[[A^[[A^[[
  167. real    0m5.363s
  168. user    0m5.360s
  169. sys 0m0.000s
  170. alumno@pelle010:~/Escritorio$ time "./a.out"
  171.  
  172. real    0m1.228s
  173. user    0m4.768s
  174. sys 0m0.016s
  175. */
  176.  
  177.  
  178. /*
  179. La diferencia importante ocurre cuando hacemos que j sea el ultimo en iterar, lo cual es bueno por localidad de datos.
  180.  
  181.  
  182.  
  183. USANDO ORDEN DE FORS ijk
  184. alumno@pelle010:~/Escritorio$ gcc matrix.c -o pepe
  185. alumno@pelle010:~/Escritorio$ time "./pepe"
  186.  
  187. real    0m5.515s
  188. user    0m5.512s
  189. sys 0m0.000s
  190.  
  191. USANDO ORDEN DE FORS ikj (Es el más rápido)
  192. alumno@pelle010:~/Escritorio$ gcc matrix.c -o pepe
  193. alumno@pelle010:~/Escritorio$ time "./pepe"
  194.  
  195. real    0m3.627s
  196. user    0m3.624s
  197. sys 0m0.000s
  198. */
  199.  
  200.  
  201.  
  202. /*
  203. No hay diferencia entre kij e ikj
  204.  
  205. ORDEN IJK
  206. alumno@pelle010:~/Escritorio$ gcc matrix.c -o pepe
  207. alumno@pelle010:~/Escritorio$ time "./pepe"
  208.  
  209. real    0m5.364s
  210. user    0m5.356s
  211. sys 0m0.008s
  212. alumno@pelle010:~/Escritorio$ time "./pepe"
  213.  
  214. real    0m5.477s
  215. user    0m5.476s
  216. sys 0m0.000s
  217.  
  218. ORDEN KIJ
  219. alumno@pelle010:~/Escritorio$ gcc matrix.c -o pepe
  220. alumno@pelle010:~/Escritorio$ time "./pepe"
  221.  
  222. real    0m2.995s
  223. user    0m2.992s
  224. sys 0m0.000s
  225. alumno@pelle010:~/Escritorio$ gcc matrix.c -o pepe
  226. alumno@pelle010:~/Escritorio$ time "./pepe"
  227.  
  228. real    0m2.993s
  229. user    0m2.988s
  230. sys 0m0.004s
  231. alumno@pelle010:~/Escritorio$ time "./pepe"
  232.  
  233. real    0m2.998s
  234. user    0m2.996s
  235. sys 0m0.000s
  236.  
  237. ORDEN IKJ
  238. alumno@pelle010:~/Escritorio$ gcc matrix.c -o pepe
  239. alumno@pelle010:~/Escritorio$ time "./pepe"
  240.  
  241. real    0m2.980s
  242. user    0m2.976s
  243. sys 0m0.000s
  244. alumno@pelle010:~/Escritorio$ time "./pepe"
  245.  
  246. real    0m2.982s
  247. user    0m2.980s
  248. sys 0m0.000s
  249.  
  250.  
  251. */
  252.  
  253.  
  254. // EJERCICIO 3
  255. // Usando un parallel for no es más rápido, los cambios entre threads se vuelven violentos.
  256.  
  257. #include <stdio.h>
  258. #include <stdlib.h>
  259. #include <omp.h>
  260. #include <limits.h>
  261. #define N 500000000
  262. #define NUM_THREADS 1
  263.  
  264. int min(int a, int b)
  265. {
  266.     if(a < b)
  267.         return a;
  268.     return b;
  269. }
  270.  
  271. int A[N];
  272. int MINIMO[NUM_THREADS];
  273.  
  274.  
  275. int main()
  276. {
  277.     int i;
  278.    
  279.     for(i = 0; i < N; ++i)
  280.         A[i] = random()%(1<<20);
  281.    
  282.     for(i = 0; i < NUM_THREADS; ++i)
  283.         MINIMO[i] = INT_MAX;
  284.        
  285.     int total = INT_MAX;
  286.    
  287.     #pragma omp parallel for reduction(min : total) num_threads(NUM_THREADS)
  288.     for(i = 0; i < N; ++i){
  289.         total = min(A[i], total);
  290.     }
  291.    
  292.     printf("%d\n", total);
  293.     return 0;
  294. }
  295.  
  296.  
  297. // EJERCICIO 4
  298. /*
  299. La version original tiene el inconveniente de que la cantidad de threads generados crece exponencialmente con el tamaño del arreglo. Entonces, los cambios de contexto hacen que demore mucho más, además de que con un largo lo suficientemente grande, hay un Segmentation Fault. Modificando el código para acotar la cantidad de threads mejora el rendimiento y evita que haya errores en la ejecución.
  300. */
  301.  
  302.  
  303. #include <stdio.h>
  304. #include <stdlib.h>
  305. #include <pthread.h>        
  306.  
  307. #define N 10000000
  308. #define ALTURA_TOTAL 2
  309.  
  310. typedef struct {
  311.     int *v;
  312.     int b, t, h;
  313. } qsparams;
  314.  
  315. void swap(int *v, int i, int j)
  316. {
  317.     int tmp=v[i];
  318.     v[i]=v[j];
  319.     v[j]=tmp;
  320. }
  321.  
  322. int colocar(int *v, int b, int t)
  323. {
  324.     int i;
  325.     int pivote, valor_pivote;
  326.     int temp;
  327.    
  328.     pivote = b;
  329.     valor_pivote = v[pivote];
  330.     for (i=b+1; i<=t; i++){
  331.         if (v[i] < valor_pivote){
  332.             pivote++;    
  333.             swap(v,i,pivote);
  334.         }
  335.     }
  336.     temp=v[b];
  337.     v[b]=v[pivote];
  338.     v[pivote]=temp;
  339.     return pivote;
  340. }
  341.  
  342. void QuicksortSeq(int* v, int b, int t)
  343. {
  344.     int pivote;
  345.     if(b < t){
  346.         pivote=colocar(v, b, t);
  347.         QuicksortSeq(v, b, pivote-1);
  348.         QuicksortSeq(v, pivote+1, t);
  349.     }  
  350. }
  351.  
  352. void *Quicksort(void *p)
  353. {
  354.     qsparams *params = (qsparams *)p;
  355.     int *v = params->v;
  356.     int b = params->b;
  357.     int t = params->t;
  358.     int h = params->h;
  359.  
  360.     int pivote;
  361.     if(b < t){
  362.         if (h > 0){
  363.             pthread_t t1, t2;
  364.             pivote=colocar(v, b, t);
  365.             qsparams params1, params2;
  366.             params1.v = v;
  367.             params1.b = b;
  368.             params1.t = pivote-1;
  369.             params1.h = h - 1;
  370.             params2.v = v;
  371.             params2.b = pivote+1;
  372.             params2.t = t;
  373.             params2.h = h - 1;
  374.             pthread_create(&t1, 0, Quicksort, (void *)&params1);
  375.             pthread_create(&t2, 0, Quicksort, (void *)&params2);
  376.             pthread_join(t1, NULL);
  377.             pthread_join(t2, NULL);
  378.         }      
  379.         else
  380.             QuicksortSeq(v, b, t);
  381.        
  382.     }  
  383. }
  384.  
  385.  
  386. void checker(int * a){
  387.     int i;
  388.     for(i=0; i < N-1; i++){
  389.         if(a[i] > a[i+1]){
  390.             printf("Desordenado \n");
  391.             return;
  392.             }
  393.     }
  394.         printf("Ordenado \n");
  395.    
  396. }
  397.  
  398.  
  399. int main(int argc, char **argv)
  400. {
  401.     int *a,i;
  402.     pthread_t t;
  403.  
  404.     a = malloc(N*sizeof(int));
  405.  
  406.     for(i=0;i<N;i++)
  407.         a[i]=random()%N;
  408.    
  409.     checker(a);
  410.    
  411.     qsparams params;
  412.     params.v = a;
  413.     params.b = 0;
  414.     params.t = N-1;
  415.     params.h = ALTURA_TOTAL - 1;
  416.     pthread_create(&t, 0, Quicksort, (void *)&params);
  417.     pthread_join(t, NULL);
  418.  
  419.     checker(a);
  420.  
  421.     free(a);
  422.     return 0;
  423. }
  424.  
  425.  
  426.  
  427.  
  428. /*
  429. alumno@pelle010:~/Escritorio$ gcc qs.c
  430. alumno@pelle010:~/Escritorio$ gcc qs_mt.c -lpthread -o a_mt.out
  431. alumno@pelle010:~/Escritorio$ time "./a.out"
  432. Desordenado
  433. Ordenado
  434.  
  435. real    0m2.365s
  436. user    0m2.364s
  437. sys 0m0.000s
  438. alumno@pelle010:~/Escritorio$ time "./a_mt.out"
  439. Desordenado
  440. Ordenado
  441.  
  442. real    0m1.503s
  443. user    0m2.364s
  444. sys 0m0.000s
  445.  
  446.  
  447. */
  448.  
  449.  
  450.  
  451. // EJERCICIO 5
  452.  
  453. #include <stdio.h>
  454. #include <pthread.h>
  455. #include <stdlib.h>
  456. #include <unistd.h>
  457.  
  458. #define N 100
  459. #define ARRLEN 100000  
  460.  
  461. int arr[ARRLEN], ctos;
  462. pthread_cond_t nadie = PTHREAD_COND_INITIALIZER;
  463. pthread_mutex_t ml = PTHREAD_MUTEX_INITIALIZER;
  464.  
  465. int esc, lect;
  466.  
  467. void *escritor(void *arg)
  468. {
  469.   int i;
  470.   int num = *((int *)arg);
  471.   for (;;) {
  472.     sleep(random()%3);
  473.    
  474.     pthread_mutex_lock(&ml);
  475.    
  476.     while(lect || esc)
  477.         pthread_cond_wait(&nadie, &ml);
  478.    
  479.     //~ printf("Soy el escritor %d y me muero de hambre. Debi estudiar Lcc.\n", num);
  480.    
  481.     esc++;
  482.    
  483.     for (i=0; i<ARRLEN; i++) {
  484.       arr[i] = num;
  485.     }
  486.    
  487.     esc--;
  488.    
  489.     pthread_cond_signal(&nadie);
  490.     pthread_mutex_unlock(&ml);
  491.   }
  492.   return NULL;
  493. }
  494.  
  495. void *lector(void *arg)
  496. {
  497.   int v, i, err;
  498.   int num = *((int *)arg);
  499.   for (;;) {
  500.     sleep(random()%3);
  501.    
  502.     pthread_mutex_lock(&ml);
  503.     while(esc)
  504.         pthread_cond_wait(&nadie, &ml);
  505.     lect++;
  506.     pthread_cond_signal(&nadie);
  507.     pthread_mutex_unlock(&ml);
  508.    
  509.     printf("Soy el lector %d. Estudie Lcc y tengo dinero para libros.\n", num);
  510.    
  511.     err = 0;
  512.     v = arr[0];
  513.     for (i=1; i<ARRLEN; i++) {
  514.       if (arr[i]!=v) {
  515.         err=1;
  516.         break;
  517.       }
  518.     }
  519.     if (err) printf("Lector %d, error de lectura\n", num);
  520.     else printf("Lector %d, dato %d\n", num, v);
  521.    
  522.     pthread_mutex_lock(&ml);
  523.     lect--;
  524.     pthread_mutex_unlock(&ml);
  525.   }
  526.   return NULL;
  527. }
  528.  
  529. int main()
  530. {
  531.   int i;
  532.   pthread_t lectores[N], escritores[N];
  533.   int arg[N];
  534.  
  535.   for (i=0; i<ARRLEN; i++) {
  536.     arr[i] = -1;
  537.   }
  538.   for (i=0; i<N; i++) {
  539.     arg[i] = i;
  540.     pthread_create(&lectores[i], NULL, lector, (void *)&arg[i]);
  541.     pthread_create(&escritores[i], NULL, escritor, (void *)&arg[i]);
  542.   }
  543.   pthread_join(lectores[0], NULL); /* Espera para siempre */
  544.   return 0;
  545. }
  546.  
  547.  
  548.  
  549.  
  550. // EJERCICIO 6
  551.  
  552. #include <stdio.h>
  553. #include <pthread.h>
  554. #include <stdlib.h>
  555. #include <unistd.h>
  556.  
  557. #define N 3
  558. #define ARRLEN 100000  
  559.  
  560. int arr[ARRLEN], ctos;
  561. pthread_cond_t nadie = PTHREAD_COND_INITIALIZER;
  562. pthread_mutex_t ml = PTHREAD_MUTEX_INITIALIZER;
  563.  
  564. int esc, lect, shushu;
  565.  
  566. void *escritor(void *arg)
  567. {
  568.   int i;
  569.   int num = *((int *)arg);
  570.   for (;;) {
  571.     sleep(random()%2);
  572.    
  573.     pthread_mutex_lock(&ml);
  574.    
  575.     while(lect || esc){
  576.     //  printf("Soy escritor %d y estoy en el while\n", num);
  577.         pthread_cond_wait(&nadie, &ml);
  578.         shushu++;
  579.     }
  580.     printf("Soy el escritor %d. Entre.\n", num);
  581.     esc++;
  582.    
  583.     for (i=0; i<ARRLEN; i++) {
  584.       arr[i] = num;
  585.     }
  586.    
  587.     esc--;
  588.     shushu = 0;
  589.    
  590.     pthread_cond_signal(&nadie);
  591.     pthread_mutex_unlock(&ml);
  592.   }
  593.   return NULL;
  594. }
  595.  
  596. void *lector(void *arg)
  597. {
  598.   int v, i, err;
  599.   int num = *((int *)arg);
  600.   for (;;) {
  601.    
  602.     sleep(random()%2);
  603.    
  604.     pthread_mutex_lock(&ml);
  605.    
  606.     while(esc || shushu){
  607.     //  printf("Soy lector %d y estoy en el while\n", num);
  608.         pthread_cond_wait(&nadie, &ml);
  609.     }
  610.        
  611.     lect++;
  612.     pthread_cond_signal(&nadie);
  613.     pthread_mutex_unlock(&ml);
  614.    
  615.     printf("Soy el lector %d. Entre.\n", num);
  616.    
  617.     err = 0;
  618.     v = arr[0];
  619.     for (i=1; i<ARRLEN; i++) {
  620.       if (arr[i]!=v) {
  621.         err=1;
  622.         break;
  623.       }
  624.     }
  625.     if (err) printf("Lector %d, error de lectura\n", num);
  626.     else printf("Lector %d, dato %d\n", num, v);
  627.    
  628.     pthread_mutex_lock(&ml);
  629.     lect--;
  630.     pthread_cond_signal(&nadie);
  631.     pthread_mutex_unlock(&ml);
  632.   }
  633.   return NULL;
  634. }
  635.  
  636. int main()
  637. {
  638.   int i;
  639.   pthread_t lectores[N], escritores[N];
  640.   int arg[N];
  641.  
  642.   for (i=0; i<ARRLEN; i++) {
  643.     arr[i] = -1;
  644.   }
  645.   for (i=0; i<N; i++) {
  646.     arg[i] = i;
  647.     pthread_create(&lectores[i], NULL, lector, (void *)&arg[i]);
  648.     pthread_create(&escritores[i], NULL, escritor, (void *)&arg[i]);
  649.   }
  650.   pthread_join(lectores[0], NULL); /* Espera para siempre */
  651.   return 0;
  652. }
  653.  
  654.  
  655.  
  656.  
  657. // EJERCICIO 7
  658.  
  659. /*
  660. GUIdios
  661. guIDios
  662. guidIOs
  663. guidiOS
  664. */
  665.  
  666.  
  667. #include <stdio.h>
  668. #include <pthread.h>
  669. #include <stdlib.h>
  670. #include <unistd.h>
  671.  
  672. #define N_SILLAS 5 
  673. #define N_CLIENTES 10
  674. #define N_BARBEROS 5       
  675. #define sleep_tight() (sleep(random() % 1))
  676. int sillas[N_SILLAS];
  677. int esperando, indice;
  678.  
  679. int contBarrera[N_CLIENTES];
  680. int taken[N_CLIENTES];
  681.  
  682. pthread_cond_t llegaCliente = PTHREAD_COND_INITIALIZER;
  683. pthread_mutex_t lockSilla = PTHREAD_MUTEX_INITIALIZER;
  684. pthread_mutex_t lockBarrera = PTHREAD_MUTEX_INITIALIZER;
  685. pthread_mutex_t esperandoEnLaSilla = PTHREAD_MUTEX_INITIALIZER;
  686. pthread_cond_t barrera[N_CLIENTES];
  687.  
  688.  
  689. void init_magico(){
  690.     int i;
  691.     for(i = 0; i < N_CLIENTES; i++)
  692.         pthread_cond_init(&barrera[i], 0);
  693.        
  694.     }
  695.  
  696. void funcionBarrera(int guID){
  697.     pthread_mutex_lock(&lockBarrera);
  698.     if(contBarrera[guID] == 0){
  699.         contBarrera[guID] = 1;
  700.         pthread_cond_wait(&barrera[guID], &lockBarrera);
  701.         pthread_mutex_unlock(&lockBarrera);
  702.     }
  703.     else{
  704.         pthread_cond_signal(&barrera[guID]);
  705.         contBarrera[guID] = 0;
  706.         pthread_mutex_unlock(&lockBarrera);
  707.     }
  708. }
  709.  
  710.  
  711. void me_cortan(int guID)
  712. {
  713.     printf("Soy el cliente %d y me estan cortando el pelo.\n", guID);
  714.     sleep_tight();
  715. }
  716.  
  717. void cortan2(int barbID, int guID)
  718. {
  719.     printf("Soy el barbero %d y le corto el pelo a %d.\n", barbID, guID);
  720.     sleep_tight();
  721. }
  722.  
  723. void pagan2(int guID)
  724. {
  725.     printf("Soy el cliente %d y amo el capitalismo.\n", guID);
  726.     sleep_tight();
  727. }
  728.  
  729. void me_pagan(int barbID, int guID)
  730. {
  731.     printf("Soy el barbero %d y amo que me pague el cliente %d.\n", barbID, guID);
  732.     sleep_tight();
  733. }
  734.  
  735.  
  736. void *barbero(void *arg)
  737. {
  738.    
  739.     int barbID = *((int *) arg);
  740.     int clienteActual;
  741.     for(;;){
  742.         ///Si no hay nadie, duermo.
  743.         pthread_mutex_lock(&lockSilla);
  744.         //~ pthread_cond_wait(&llegaCliente, &lockSilla);
  745.         //~ pthread_mutex_unlock(&lockSilla);
  746.         clienteActual = sillas[indice];
  747.         while(esperando == 0 || taken[clienteActual]){
  748.             printf("Barbero %d: Zzz...\n", barbID);
  749.             pthread_cond_wait(&llegaCliente, &lockSilla);
  750.             clienteActual = sillas[indice];
  751.         }
  752.         taken[clienteActual] = 1;
  753.         pthread_mutex_unlock(&lockSilla);
  754.        
  755.         ///Llamo al proximo cliente
  756.         funcionBarrera(clienteActual);
  757.        
  758.        
  759.         ///Tengo un cliente
  760.         funcionBarrera(clienteActual);
  761.         cortan2(barbID, clienteActual);
  762.        
  763.         ///Ya le corte el pelo
  764.         funcionBarrera(clienteActual);
  765.         me_pagan(barbID, clienteActual);
  766.        
  767.         ///Ya me pagaron
  768.         funcionBarrera(clienteActual);
  769.        
  770.         ///Fush fush
  771.         pthread_mutex_lock(&lockSilla);
  772.         taken[clienteActual] = 0;  
  773.         pthread_mutex_unlock(&lockSilla);
  774.     }
  775.   return NULL;
  776. }
  777.  
  778. void *guido(void *arg)
  779. {
  780.     int guID = *((int *) arg);
  781.     for(;;){
  782.         sleep_tight();
  783.        
  784.         ///Si no hay lugar, me voy
  785.         pthread_mutex_lock(&lockSilla);
  786.         if(esperando == N_SILLAS){
  787.             pthread_mutex_unlock(&lockSilla);
  788.             continue;
  789.         }
  790.        
  791.         ///Si hay lugar, me siento
  792.         sillas[(indice + esperando) % N_SILLAS] = guID;
  793.         esperando++;
  794.  
  795.         ///Si el barbero duerme, lo despierto
  796.         pthread_cond_signal(&llegaCliente);
  797.         pthread_mutex_unlock(&lockSilla);
  798.  
  799.  
  800.         ///Espero a mi turno
  801.         funcionBarrera(guID);
  802.        
  803.        
  804.         ///Largando mi silla
  805.         pthread_mutex_lock(&lockSilla);
  806.         indice = (indice + 1) % N_SILLAS;
  807.         esperando --;
  808.         pthread_mutex_unlock(&lockSilla);
  809.  
  810.  
  811.         ///Me atiende un barbero.
  812.         funcionBarrera(guID);
  813.         me_cortan(guID);
  814.        
  815.         ///Ya me corto el pelo 
  816.         funcionBarrera(guID);
  817.         pagan2(guID);
  818.        
  819.         ///Ya le pague
  820.         funcionBarrera(guID);
  821.         }
  822.   return NULL;
  823. }
  824.  
  825.  
  826. int main()
  827. {  
  828.   int i;
  829.   pthread_t barb[N_BARBEROS], guidos[N_CLIENTES];  
  830.   int arggu[N_CLIENTES];
  831.   int argba[N_CLIENTES];
  832.  
  833.   init_magico();
  834.  
  835.   for (i=0; i < N_CLIENTES; i++) {
  836.     arggu[i] = i;
  837.     pthread_create(&guidos[i], NULL, guido, (void *)&arggu[i]);
  838.   }
  839.  
  840.   for(i=0; i < N_BARBEROS; i++){
  841.     argba[i] = i;
  842.     pthread_create(&barb[i], NULL, barbero, (void *)&argba[i]);
  843.   }
  844.  
  845.   pthread_join(barb[0], NULL);
  846.   return 0;
  847. }
  848.  
  849.  
  850.  
  851.  
  852. //EJERCICIO 8
  853.  
  854. #include <stdio.h>
  855.  
  856. #include <sys/socket.h>      
  857. #include <sys/types.h>      
  858. #include <arpa/inet.h>      
  859. #include <unistd.h>        
  860. #include <string.h>        
  861. #include <pthread.h>        
  862.  
  863. #define BUFF_SIZE 1024
  864. #define CANT_CLIENT 500
  865.  
  866. int id = 0;
  867.  
  868. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  869.  
  870. void* handle_client(void* arg)
  871. {
  872.     int conn_s = *((int*) arg);
  873.     char buffer[BUFF_SIZE],buffer2[BUFF_SIZE];
  874.     int res;
  875.     int clientID;
  876.     pthread_mutex_lock(&mutex);
  877.     clientID = ++id; // Nuevo cliente
  878.     pthread_mutex_unlock(&mutex);
  879.     fprintf(stderr,"New client %d connected\n",clientID);
  880.     while(1) {
  881.         res=read(conn_s,buffer,BUFF_SIZE);
  882.         if (res<=0) {
  883.             close(conn_s);
  884.             break;
  885.         }
  886.         buffer[res]='\0';
  887.         sprintf(buffer2,"Response to client %d: %s",clientID, buffer);
  888.         write(conn_s,buffer2,strlen(buffer2));
  889.     }
  890. }
  891.  
  892. int main()
  893. {
  894.     pthread_t handler[CANT_CLIENT];
  895.     int handlerind = 0;
  896.     int list_s,conn_s=-1,res;
  897.     struct sockaddr_in servaddr;
  898.     char buffer[BUFF_SIZE],buffer2[BUFF_SIZE];
  899.     if ( (list_s = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
  900.         fprintf(stderr, "ECHOSERV: Error creating listening socket.\n");
  901.         return -1;
  902.     }
  903.     memset(&servaddr, 0, sizeof(servaddr));
  904.     servaddr.sin_family      = AF_INET;
  905.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  906.     servaddr.sin_port        = htons(8000);
  907.  
  908.     if ( bind(list_s, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ) {
  909.         fprintf(stderr, "ECHOSERV: Error calling bind()\n");
  910.         return -1;
  911.     }
  912.  
  913.     if ( listen(list_s, 10) < 0 ) {
  914.         fprintf(stderr, "ECHOSERV: Error calling listen()\n");
  915.         return -1;                          
  916.     }
  917.  
  918.     while (1) {
  919.         if ( (conn_s = accept(list_s, NULL, NULL) ) < 0 ) {
  920.             fprintf(stderr, "ECHOSERV: Error calling accept()\n");
  921.             return -1;
  922.         }
  923.        
  924.             pthread_create(&handler[handlerind], NULL, handle_client, (void*) &conn_s);
  925.             handlerind = (handlerind + 1) % CANT_CLIENT;
  926.     }
  927.     return 0;
  928. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement