Hola, tengo un problemilla con unas prácticas de sistemas operativos, la practica trata de la sincronizacion de tres hilos(H1, H2 Y H3) mediante semaforos de forma que se ejecuten los hilos H1 y H2 simultaneamente y cuando estos terminen se ejecute H3. Cuando H3 termine comienza de nuevo la ejecucion de H1 y H2 y asi sucesivamente, ejecutandose este ciclo dos veces. (H1 Y H2 -> H3 ->H1 Y H2->H3)
El codigo que tengo es el siguiente pero no funciona bien y no se cual es el problema, si alguien sabe que hago mal le agradeceria mucho que me lo dijera.
#include <stdio.h>
#include <io.h>
#include <windows.h>
#include <math.h>
#include <conio.h>
HANDLE semaforo =NULL;
HANDLE semaforo2 =NULL;
DWORD WINAPI h1(LPWORD p);
DWORD WINAPI h2(LPWORD p);
DWORD WINAPI h3(LPWORD p);
void main(int argc,char *argv[])
{
HANDLE h[3];
DWORD nombrehilo[3];
DWORD uno=1;
DWORD dos=2;
DWORD tres=3;
semaforo=CreateSemaphore(NULL,2,2,NULL);
semaforo2=CreateSemaphore(NULL,0,2,NULL);
int i,j,ciclos;
ciclos= 2;
for(i=0;i<ciclos;i++)
{
h[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)h1,&uno,0,&nombrehilo[0]);
h[2]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)h2,&dos,0,&nombrehilo[1]);
h[3]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)h3,&tres,0,&nombrehilo[2]);
WaitForMultipleObjects(3,h,TRUE,INFINITE);
printf("\nFin de ciclo %d\n",i);
}
for (j=0;j<3;i++)
CloseHandle(h[j]);
CloseHandle(semaforo);
CloseHandle(semaforo2);
}
DWORD WINAPI h1(LPWORD p)
{
if(WaitForSingleObject(semaforo,INFINITE)==WAIT_OBJECT_0)
{
printf("\nComienza hilo 1\n");
printf("\nTermina hilo 1\n");
ReleaseSemaphore(semaforo2,1,NULL);
}
else
printf("ERROR 1");
return 0;
}
DWORD WINAPI h2(LPWORD p)
{
if(WaitForSingleObject(semaforo,INFINITE)==WAIT_OBJECT_0)
{
printf("\nComienza hilo 2\n");
printf("\nTermina hilo 2\n");
ReleaseSemaphore(semaforo2,1,NULL);
}
else
printf("ERROR 2");
return 0;
}
DWORD WINAPI h3(LPWORD p)
{
if(WaitForSingleObject(semaforo2,INFINITE)==WAIT_OBJECT_0)
if(WaitForSingleObject(semaforo2,INFINITE)==WAIT_OBJECT_0)
{
printf("\nComienza hilo 3\n");
printf("\nTermina hilo 3\n");
ReleaseSemaphore(semaforo,2,NULL);
}
else
printf("ERROR 3");
return 0;
}