Skocz do zawartości

Problem Z Programem


droicyn

Rekomendowane odpowiedzi

Witam mam taki program i mam wielką prośbę czy mógłby ktoś opisać mi ten program? Bo ja szczerze mówiąc nic nie kumam o co tam chodzi ;/ to nie jest mój program dostałem go.

 

A o to ten program:

 

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include "toilet.h"

uint seed;
pthread_t thread_gototoilet[NUM_THREADS];
int tids[NUM_THREADS];

sem_t sem_toilet;
pthread_mutex_t mutex_entrance = PTHREAD_MUTEX_INITIALIZER;
int plec;
int trigger = FALSE;

int main() {
   init();
   sleep(1234567);
   return 0;
}


void* go_to_toilet(void* id) {
   int tid = *((int*)id);
   int plec_osoby;
   int num_ppl;

   while(TRUE) {
       plec_osoby = (int)(2.0 * (rand_r(&seed) /  (RAND_MAX + 1.0))); // plec nastepnej osoby

       while(trigger == TRUE) {
           sleep(1);
       }        
       pthread_mutex_lock(&mutex_entrance);
       sem_getvalue(&sem_toilet, &num_ppl);
       if (plec_osoby != plec && num_ppl != ILOSC_TOALET) {
           printf("Czekam az osoby innej plci opuszcza toalete - Proba #%d, plec %d\n", tid, plec_person);
       }
       while (plec_osoby != plec && num_ppl != ILOSC_TOALET) {
           trigger = TRUE;
           sem_getvalue(&sem_toilet, &num_ppl);
           sleep(1);

       }        
       trigger = FALSE;
       sem_wait(&sem_toilet);
       if (num_ppl == ILOSC_TOALET) {
           plec = plec_osoby;
       }
       pthread_mutex_unlock(&mutex_entrance);
       printf("Jestem w toalecie - Zajete ! ! ! - Proba #%d, plec %d.\n", tid, plec_osoby);
       sleep((int)(30.0 * (rand_r(&seed) /  (RAND_MAX + 1.0))));
       printf("Wychodze z toalety - Juz wolne - Proba #%d, plec %d.\n", tid, plec_osoby);
       sem_post(&sem_toilet);
       sleep(1);
   }

   return NULL;
}


int init() {
   int i;
   sem_init(&sem_toilet, 0, ILOSC_TOALET);
   seed = getpid();
   for (i = 0; i < NUM_THREADS; i++) {
       tids[i] = i;
       if (pthread_create(&thread_gototoilet[i], NULL, go_to_toilet, &tids[i]) != 0) {
           return FALSE;
       }
   }
   signal(SIGTERM, cleanup);
   signal(SIGINT, cleanup);
   return TRUE;
}


void cleanup() {
   int i;
   printf("Wychodze z programu ...\n");
   pthread_mutex_destroy(&mutex_entrance);
   sem_destroy(&sem_toilet);
   for (i = 0; i < NUM_THREADS; i++) {
       pthread_cancel(thread_gototoilet[i]);
   }
   exit(0);
}

 

 

i druga jego część:

 

#define NUM_THREADS 10
#define ilosc_toalet 2

#define TRUE 1
#define FALSE -1

void* go_to_toilet(void* id);
int init();
void cleanup();

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...