Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/11/2012, 09:33
joanan46
 
Fecha de Ingreso: septiembre-2011
Mensajes: 87
Antigüedad: 13 años, 3 meses
Puntos: 6
Linux C - Threads

Buenas tardes gente.

A ver primero de todo decir que en esto de los threads voy un poco flojo. Me cuesta entederlo, pero aqui estoy para ver si me podeis ayudar.

Os pondre la parte del programa que me falla.

El programa va sobre: tengo 3 hilos, 4 semaforos, y dos tablas (aux, num) de int[x]. Un hilo pedira un numero y lo pondra en la tabla aux, el segundo pasara el numero de la tabla aux a la tabla num, y el tercero leera de la tabla num. Todo esto jugando con los semaforos, para que no se avancen los hilos.

Código C:
Ver original
  1. typedef struct {
  2.     int tnum[K];            //array 1  
  3.     int tnumAux[K];               // array2    //los 2 son arrays circulares.
  4.     unsigned int in;            //en realidad solo necesito esta variable de todas las unsigned que tengo. Me dira si he llegado a final del array, y se pondra a 0 de nuevo.
  5.     unsigned int out;          
  6.     unsigned int num;          
  7.     unsigned int M_in;         
  8.     unsigned int M_out;        
  9. } t_data;
  10.  
  11. pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
  12.  
  13. sem_t sem1, sem2, sem3, sem4;
  14.  
  15.  
  16. void *f_in (void *d) {
  17. // Atenció al productor
  18. t_data *dt = (t_data *)d;
  19. int car;
  20. int fi=0, err;
  21.  
  22.     //for(fi=0;fi<K;fi++) {7
  23.     do{
  24.    
  25.         sem_wait(&sem1);
  26.         pthread_mutex_lock (&mut);
  27.  
  28.         printf("Pido numero:\n");
  29.         err = read(0,&car,1);
  30.  
  31.         dt->tnum[(dt->in)] = car;
  32.         //dt->paella[dt->in] = dt->M_in;
  33.         //printf ("He col·locat l'ou: %d\n", (dt->M_in)++);
  34.         (dt->in)++;
  35.         if (dt->in == K) dt->in = 0;
  36.         (dt->num)++;
  37.        
  38.  
  39.         printf("salimos,  Sem2 en verde:\n", car);
  40.         pthread_mutex_unlock (&mut);
  41.         sem_post(&sem2);
  42.     }while(car!='.');
  43. }
  44.  
  45. int main (int argc, char **argv) {
  46. t_data data;
  47. pthread_t pth[F];
  48. int i;
  49.     data.in = data.out = data.num = data.M_in = data.M_out = 0;
  50.  
  51.     sem_init(&sem1,0,1);
  52.     sem_init(&sem2,0,1);
  53.     sem_init(&sem3,0,1);
  54.     sem_init(&sem4,0,1);
  55.  
  56.     pthread_create (&(pth[0]), NULL, &f_in, (void *)&data);
  57.     pthread_create (&(pth[1]), NULL, &f_ch, (void *)&data);
  58.     pthread_create (&(pth[2]), NULL, &f_out, (void *)&data);
  59.  
  60.     for (i = 0; i<F; i++) pthread_join (pth[i], NULL);
  61. return (0);
  62. }

El problema que tengo es que al poner el semaforo sem1 en "rojo", se me bloquea el programa, solo escribo numero pero no sale nada, se queda atontao.

Verdadaramente no se ver el error. Alguien lo ve.

pd: el error o errores ejej.

Saludos