#define rozmiar_semafora 10
struct sem{
int s; //semafor ogolny
int b1; //semafor binarny
int nr_wait; //okresla pozycje wątku do czekania
int nr_activ; //okresla pozycje wątku do wznowienia
proc lista[rozmiar_semafora];
};
sem semafor;
/////////////////
//Inicjalizacja
/////////////////
semafor.s=1; //określa liczbę wątków mogących wykonywać jednocześnie sekcje krytyczną
semafor.b1=0; //gwarantuje niepodzielność wait i signal
semafor.nr_wait=0; //liczy od 0
semafor.nr_activ=0; //liczy od 0
////////////////
void __fastcall wait(sem* _semafor,int _id_proces,HANDLE _proces)
{
wait_bin(&_semafor->b1);
///////////////////////////
_semafor->s--;
if(_semafor->s<0){
proc temp_proces;
temp_proces.id_procesu_=_id_proces;
temp_proces.uchwyt_procesu=_proces;
_semafor->nr_wait++;
if(_semafor->nr_wait==rozmiar_semafora+1)_semafor->nr_wait=1;
//zapętlenie bufora (bufor cykliczny)
_semafor->lista[_semafor->nr_wait]=temp_proces;
signal_bin(&_semafor->b1);
SuspendThread(_proces);
goto wyjscie;
}
//////////////////////////
signal_bin(&_semafor->b1);
wyjscie:
}
//---------------------------------------------------------------------------
void __fastcall signal(sem* _semafor)
{
wait_bin(&_semafor->b1);
/////////////////////////
proc temp_proces;
_semafor->s++;
if(_semafor->s<=0){
//_semafor->zwrot=1;
_semafor->nr_activ++;
if(_semafor->nr_activ==rozmiar_semafora+1)_semafor->nr_activ=1;
temp_proces=_semafor->lista[_semafor->nr_activ];
ResumeThread(temp_proces.uchwyt_procesu);
}
//////////////////////////
signal_bin(&_semafor->b1);
}