Código:
El campo en concreto que me está incordiando es "descargado_total", que realmente es el único que se modifica. La función que lo modifica se llama "descargar", y se lanza en un hilo aparte desde main así:struct descarga { FILE *fichero_fisico; void *sha1; int tam_total; char nombre[1024]; char **peers_ip; int *peers_puertos; int n_peers; int *descargado; //Para cada pieza, indica el tamaño descargado int descargado_total; int n_piezas; int tam_pieza; struct descarga *sig; };
Código:
La porción de código que modifica el campo "descarga_total" en el hilo es esta://Se rellenan los campos de la estructura descarga. "descarga_total" se pone a cero. descarga=preparar_descarga(buffer); //Se añade a una cola de descargas: cola=encolar(descarga,cola); //Se lanza la descarga: if(descarga!=NULL) { if(fork()==0) descargar(descarga); }
Código:
Y la parte del main que muestra los valores de los campos para la lista de estructuras descarga es esta:case 7: memcpy((void *)&index,buff,sizeof(int)); index=ntohl(index); buff=buff+4; memcpy((void *)&begin,buff,sizeof(int)); begin=ntohl(begin); buff=buff+4; descarga->descargado[index]+=(tam-9); offset=buff; volcar_a_fichero(descarga->fichero_fisico,index*descarga->tam_pieza+begin,tam-9,offset); buff=buff-8; bytes+=tam-9; /*******AQUI SE ACTUALIZA EL VALOR******/ descarga->descargado_total+=tam-9; /***********************************************/ break;
Código:
Siempre muestra que "descargado_total" vale cero. He leído por ahí que al compartir variables entre hilos es aconsejable usar volatile, pero lo he probado poniendo "volatile int descargado_total" y pasa igual. iter=cola; printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); while(iter!=NULL) { printf("%s \n\t %d de %d bytes\n\n\n",iter->nombre,iter->descargado_total,iter->tam_total); iter=iter->sig; } printf("Presionar enter para continuar..."); while ( getchar() != '\n');