Robotyzacja.com

..robotyka wokół naszych myśli

  • Zwiększ rozmiar czcionki
  • Domyślny  rozmiar czcionki
  • Zmniejsz rozmiar czcionki
Automatyka i Robotyka C++ Współbieżność Realizacja semafora ogólnego

Realizacja semafora ogólnego

Email Drukuj
Ocena użytkowników: / 1
SłabyŚwietny 
 
#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(&amp;_semafor->b1);
               SuspendThread(_proces);
                goto wyjscie;
                }
//////////////////////////
signal_bin(&amp;_semafor->b1);
wyjscie:
}
//---------------------------------------------------------------------------
void __fastcall signal(sem* _semafor)
{
wait_bin(&amp;_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(&amp;_semafor->b1);
}
 
 
Naszą witrynę przegląda teraz 2 gości 

Szukaj artykułu

Partnerzy