SEMAFORI N-ARI





Un semaforo n-ario segnala "libero" quando la variabile semaforica è maggiore di 0 e "occupato" quando essa è uguale a zero .Tale variabile è decrementata di uno ogni volta che WaitForSingleObject dà l'accesso alla risorsa e decrementata quando viene chiamata ReleaseSemaphore
Un semaforo n-ario si crea con  CreateSemaphore    

CreateSemaphore
 HANDLE CreateSemaphore(
   LPSECURITY_ATTRIBUTES lpSemaphoreattributes,
   long                  lInitialCount,
   long                  lMaximumCount,
   LPCTSTR               lpName
     )


Per rilasciare il semaforo si usa la funzione ReleaseSemaphore

ReleaseSemaphore
 BOOL ReleaseSemaphore(
   HANDLE      hSemaphore
   long        lReleaseCount,
   long        lPreviousCount
   )


Il motivo per cui la variabile lReleaseCount può essere aumentata di una quantità più grande di 1 è legato alla possibilità di effettuare particolari operazioni sul semaforo. Per esempio se poniamo 
             hsem = CreateSemaphore(NULL, 0, MAXVARSEM,"miosem"); 
il semaforo viene creato "occupato"
Per renderlo disponibile bisogna chiamare:
            ReleaseSemaphore(hsem,MAXVARSEM,NULL)
in cui come si vede lReleaseCount viene posta al valore massimo della variabile semaforica.