C/Visual C - FREE Y MUTEX

 
Vista:

FREE Y MUTEX

Publicado por picatostenes (1 intervención) el 27/10/2008 18:27:06
Hola, tengo un problema con un código. Utiliza Mutex para compaginar 2 procesos, creados mediante dos hilos. Uno de ellos ejecuta la función fileReader, que crea una lista de archivos a partir de un directorio raíz y el otro lo envía con la función sendMMS.

Cuando el hilo principal ha creado una lista, ésta es intercambiada con la que se está enviando, para poder enviar la nueva lista creada. Entonces se libera la memoria de la lista que se estaba enviando justo antes del cambio (la que se va a usar de nuevo para hacer fileReader).

El programa funciona bien si no libero la lista, pero si lo hago, en la forma en que se muestra, da un error de ejecución. ¿Alguien sabe por qué?. He aquí el código:

FileItem* LL[2] = {NULL, NULL};
FileItem* apuntador=NULL,*apuntador_lista_ant1=NULL,*apuntador_lista_ant2=NULL;
int nueva_lista = 0,no_usada = 0,i=0,vueltas = 0, usada = 1,m=0;
HANDLE hMutex1,hMutex2;
HANDLE hThr = 0;
DWORD dwThreadId;

void ThreadMain(void)
{
int MAX_PRIORIDAD=15;
int j=0,k=0;

ReleaseMutex(hMutex1);


while (LL[usada]==NULL)
{
Sleep(1000);
}


do
{
for (j=0; j<MAX_PRIORIDAD; j++)
{


apuntador=LL[usada];

while (apuntador!=NULL)
{
if (j % apuntador->prior == 0)

{


for (k=0;k<=(apuntador->section->n_packets-1);k++)
{
int z=0;

apuntador->section->n_packets , apuntador->path);

for (z=0; z<188; z++)
printf ("%02x ", apuntador->section->packet[k][z]);
printf (" ");

sendMMs((unsigned char *)apuntador->section->packet[k],188);

}



}
apuntador=apuntador->next;
}

ReleaseMutex(hMutex1);

WaitForSingleObject(hMutex1,INFINITE);

}


} while (1);

}

int main(int argc, char** argv)
{
SOCKET_INIT

hMutex1=CreateMutex(NULL,FALSE,"enviar");
hMutex2=CreateMutex(NULL,FALSE,"enviar2");

assert(hMutex1!=NULL);
assert(hMutex2!=NULL);


hThr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadMain,NULL,0,&dwThreadId);
//ReleaseMutex(hMutex2);


do
{

//id=renombrar(0);

if (LL[no_usada]!=NULL)
{
apuntador_lista_ant1=LL[no_usada];

while (apuntador_lista_ant1!=NULL)
{

for (m=0;m<=apuntador_lista_ant1->section->n_sections-1;m++)

{
free(apuntador_lista_ant1->section->section[m]);
apuntador_lista_ant1->section->section[m]=NULL;
//sections[m]=NULL;
}



for (m=0;m<=apuntador_lista_ant1->section->n_packets-1;m++)

{
free(apuntador_lista_ant1->section->packet[m]);
//free(packets[m]);
apuntador_lista_ant1->section->packet[m]=NULL;
}

free(apuntador_lista_ant1->section->packet);
apuntador_lista_ant1->section->packet=NULL;
free(apuntador_lista_ant1->section);
apuntador_lista_ant1->section=NULL;

//apuntador_lista_ant2=apuntador_lista_ant1;
apuntador_lista_ant1=apuntador_lista_ant1->next;
free(apuntador_lista_ant2);
apuntador_lista_ant2=NULL;


}
LL[no_usada]=NULL;
//printf("Va a relesear mutex1");
}


LL[no_usada] = fileReader(LL[usada]);
nueva_lista = 1;



WaitForSingleObject(hMutex1,INFINITE);


if (no_usada == 0)
{no_usada = 1;
usada=0;}
else
{no_usada = 0;
usada=1;}

revisar_prioridades (LL[usada]);



nueva_lista = 0;
ReleaseMutex(hMutex1);


} while (1);

CloseHandle(hThr);
CloseHandle(hMutex1);

return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder