Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Hilos y variables compartidas

Estas en el tema de Hilos y variables compartidas en el foro de C/C++ en Foros del Web. Hola, tengo un programa con una estructura que es modificada por un hilo, y quiero mostrar en la función main que lanza el hilo los ...
  #1 (permalink)  
Antiguo 18/04/2009, 09:13
 
Fecha de Ingreso: marzo-2009
Mensajes: 16
Antigüedad: 15 años, 2 meses
Puntos: 0
Hilos y variables compartidas

Hola, tengo un programa con una estructura que es modificada por un hilo, y quiero mostrar en la función main que lanza el hilo los valores que van tomando los campos de la estructura. El problema es que cuando en main muestro por pantalla los valores, siempre me sale el valor que tenía inicialmente la estructura (que es cero). La estructura es esta:

Código:
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;
};
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í:

Código:
	
//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);
}
La porción de código que modifica el campo "descarga_total" en el hilo es esta:

Código:
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;
Y la parte del main que muestra los valores de los campos para la lista de estructuras descarga es esta:

Código:
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');
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.
  #2 (permalink)  
Antiguo 18/04/2009, 12:44
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Hilos y variables compartidas

Depuralo ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:06.