droicyn Napisano Luty 12, 2008 Zgłoszenie Share Napisano Luty 12, 2008 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 More sharing options...
Rekomendowane odpowiedzi
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ę