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');

