• Domingo 15 de Diciembre de 2024, 02:47

Autor Tema:  Sincronización Con Semaforos  (Leído 1945 veces)

nayade

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Sincronización Con Semaforos
« en: Lunes 15 de Mayo de 2006, 00:39 »
0
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;
}