/* ========================================================================== */ /* */ /* Let.cpp */ /* Jan Dvořák z Vozerovic */ /* */ /* Vlákno letu */ /* */ /* ========================================================================== */ #ifndef _LETISTE_LET_ #define _LETISTE_LET_ /******************************************************************************/ void *letProcedura(void* arg) { Let *l; int x=(int)arg; sem_wait(&zamkyLetu[x]); //zamkneme , probudíme letištěm //sem_wait(&zamkyLetu[x]); sem_post(&zamkyLetu[x]); //probudíme pasažéry sem_wait(&zamknutiVytvareniLetu); l=&seznamLetu[x]; int pVp=l->poziceVpoli; sem_post(&zamknutiVytvareniLetu); // pthread_mutex_lock(&mutexPasazeru[pVp]); pthread_cond_broadcast(&condPasazeru[pVp]); pthread_mutex_unlock(&mutexPasazeru[pVp]); //vynulujeme na další použití pthread_cond_init(&condPasazeru[pVp],NULL); //, počkáme na ně sem_wait(&zamknutiVytvareniLetu); l=&seznamLetu[x]; int obsazeno=l->obsazeno; sem_post(&zamknutiVytvareniLetu); pthread_barrier_init(&barieryLetu[pVp],NULL,obsazeno+1 ); //pasažéři + let pthread_barrier_wait(&barieryLetu[pVp]); //výpis hlášky do konzole sem_wait(&zamknutiVytvareniLetu); l=&seznamLetu[x]; printf("Let %d na lince %s - %s odleta, obsazeno %d.\n",l->ID,l->start,l->cil,obsazeno); sem_post(&zamknutiVytvareniLetu); //zamkneme , probudíme letištěm sem_wait(&zamkyLetu[x]); //zamkneme sem_wait(&zamkyLetu[x]); //čekáme na probuzení od letiště sem_post(&zamkyLetu[x]); sem_wait(&zamknutiVytvareniLetu); l=&seznamLetu[x]; printf("Let %d na lince %s - %s pristava.\n",l->ID,l->start,l->cil); sem_post(&zamknutiVytvareniLetu); //probudíme pasažéry aby vystoupili pthread_mutex_lock(&mutexPasazeru[pVp]); pthread_cond_broadcast(&condPasazeru[pVp]); pthread_mutex_unlock(&mutexPasazeru[pVp]); // //nyní je už vlákno letu nepotřebné KONEC - nastavíme přížnak sem_wait(&zamknutiVytvareniLetu); seznamLetu[x].stav=3; sem_post(&zamknutiVytvareniLetu); return NULL; } /******************************************************************************/ /* Funkce zapiš na let */ /******************************************************************************/ bool zapisPasazeraNaLet(int poziceVpoli) { pthread_mutex_lock (&zapsaniNaLet); //vejde se? if(seznamLetu[poziceVpoli].obsazeno>=seznamLetu[poziceVpoli].kapacita) { pthread_mutex_unlock (&zapsaniNaLet); return false; } // seznamLetu[poziceVpoli].obsazeno++; pthread_mutex_unlock (&zapsaniNaLet); return true; } /******************************************************************************/ /* Funkce zkontroluj let */ /******************************************************************************/ void zkontrolujLet(char*odkud, char*kam, int cena,kontrolaLetu &kontrola) { kontrola.nalezen=false; //zkusíme najít přímé spojení int i; for(i=0;i=seznamLetu[i].cena) &&(seznamLetu[i].stav==0) &&(seznamLetu[i].obsazenonazev); sem_post(&zamknutiVytvareniLetist); */ int i; // while(!KONEC_APLIKACE) { //vytvoření letů sem_wait(&zamknutiVytvareniLetu); for(i=0;i=seznamLetu[i].odlet) ) { //tento let je z tohoto letiště, odemkneme seznamLetu[i].stav=1; //letí sem_post(&zamkyLetu[i]); } //přílet if( (seznamLetu[i].stav==1) && ( systemovyCas>=(seznamLetu[i].odlet+seznamLetu[i].doba) ) ) { seznamLetu[i].stav=2; //letí sem_post(&zamkyLetu[i]); } } } sem_post(&zamknutiVytvareniStruktur); // } //sloučení vláken letů (těch co zatím nebyly) for(i=0;istart,p->cil,p->penize,letID); if(letID.nalezen) { //zapišeme se do letu if( !zapisPasazeraNaLet( letID.poziceVpoli ) ) { //zápise se nepovedl, hedáme znovu sem_post(&zamknutiVytvareniStruktur); goto znovu; }else{ printf("Pasazer %d ceka na letisti %s na let %d\n",p->ID,p->start,letID.ID); p->nalezenLet=true; p->letID=letID.ID; } sem_post(&zamknutiVytvareniStruktur); // }else{ if(!probehlaKontrola)printf("Pasazer %d ceka na letisti %s, zadny let nevyhovuje.\n",p->ID,p->start); if(KONEC_VSTUPU) { printf("Pasazer %d nemuze byt odbaven - uz neexistuje zadny vhodny let.\n", p->ID); sem_post(&zamknutiVytvareniStruktur); return NULL; } probehlaKontrola=true; sem_post(&zamknutiVytvareniStruktur); goto znovu; } //nyní vlákno pozastavíme, počkáme na probuzení int i; //pozice letu v poli sem_wait(&zamknutiVytvareniStruktur); p=&(seznamPasazeru[(int)arg]); for(i=0;iletID) )break; if(i==pocetLetu) { printf("Nastala chyba - nebyl nalezen pasazeruv let.\n"); ukonciUlohu(); } sem_post(&zamknutiVytvareniStruktur); // pthread_mutex_lock(&mutexPasazeru[i]); pthread_cond_wait(&condPasazeru[i],&mutexPasazeru[i]); pthread_mutex_unlock(&mutexPasazeru[i]); //pasažér nastupuje do letadla... sem_wait(&zamknutiVytvareniPasazeru); p=&(seznamPasazeru[(int)arg]); printf("Parazer %d naseda do letu %d na lince %s - %s.\n",p->ID,p->letID,seznamLetu[i].start,seznamLetu[i].cil); sem_post(&zamknutiVytvareniPasazeru); //dáme signál letu pthread_barrier_wait(&barieryLetu[i]); //pasažér je v letadle pthread_mutex_lock(&mutexPasazeru[i]); pthread_cond_wait(&condPasazeru[i],&mutexPasazeru[i]); pthread_mutex_unlock(&mutexPasazeru[i]); //vyúčtování sem_wait(&zamknutiVytvareniPasazeru); p=&(seznamPasazeru[(int)arg]); p->cenaCelkem+=seznamLetu[i].cena; p->penize-=seznamLetu[i].cena; sem_post(&zamknutiVytvareniPasazeru); //přestup / konec? sem_wait(&zamknutiVytvareniPasazeru); if(strcmp(p->cil,seznamLetu[i].cil)==0) { printf("Parazer %d dosahl cile %s, cena za let byla %d.\n",p->ID,seznamLetu[i].cil,p->cenaCelkem); sem_post(&zamknutiVytvareniPasazeru); }else{ //passažér přestupuje - nastavíme nový výchozí bod strcpy(p->start,seznamLetu[i].cil); sem_post(&zamknutiVytvareniPasazeru); //skočíme na začátek goto znovu; } // return NULL; } #endif /* ========================================================================== */ /* */ /* Hodiny.cpp */ /* Jan Dvořák z Vozerovic */ /* */ /* Systémové hodiny */ /* */ /* ========================================================================== */ #ifndef _LETISTE_HODINY_ #define _LETISTE_HODINY_ /******************************************************************************/ void *systemoveHodiny(void*arg) { int cas=(int)arg; while(!KONEC_APLIKACE) { usleep(cas); systemovyCas++; //printf("CAS: %d\n",systemovyCas); } return NULL; } #endif /* ========================================================================== */ /* */ /* STRUKTURY.CPP */ /* JAN DVOŘÁK z VOZEROVIC */ /* */ /* Deklarace struktur */ /* */ /* ========================================================================== */ #ifndef _LETISTE_STRUKTURY_ #define _LETISTE_STRUKTURY_ /******************************************************************************/ typedef struct Letiste { char nazev[51]; }; typedef struct Let { int ID; char start[51]; char cil[51]; int odlet; int doba; int kapacita; int cena; int obsazeno; int poziceLetisteVpoli; int stav; /*-1:ještě není letadlo (není spuštěno vákno letu) 0:čeká na odlet 1:letí 3:schopný sloučení 4:sloučeno */ int poziceVpoli; }; typedef struct Pasazer { int ID; char start[51]; char cil[51]; int penize; bool nalezenLet; int letID; int cenaCelkem; }; typedef struct kontrolaLetu { bool nalezen; int ID; int poziceVpoli; }; #endif