Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Meno:
- Datum:
- Simulujte nasledujucu situaciu. V kmeni su dve kasty: lovci (6 lovcov) a zberaci (12 zberacov). Uctievaju bozstvo, ktoremu chodia davat dary do chramu. Lovec lovi zver nejaky cas (v simulacii 6s) a potom ide do chramu dat cast ulovku ako dar bozstvu, co tiez trva nejaky cas (v simulacii 2s). Zberac zbiera plody nejaky cas (v simulacii 4s) a potom ide do chramu dat cast plodov bozstvu, co tiez trva nejaky cas (v simulacii 1s). Cela simulacia nech trva 30s.
- 1. Doplnte do programu pocitadlo pocitajuce, kolko krat bozstvu dali dar lovci a kolko krat zberaci. [2b]
- 2. Zabezpecte, aby do chramu sucasne mohli vojst maximalne dvaja lovci alebo styria zberaci, iba prislusnici jednej kasty naraz. Ak je pred chramom rad, zabezpecte spravodlivy pristup (kasty su si rovnocenne). [5b]
- 3. Osetrite v programe spravne ukoncenie simulacie po uplynuti stanoveneho casu. [3b]
- Poznamky:
- - na synchronizaciu pouzite iba mutexy, podmienene premenne alebo semafory
- - nespoliehajte sa na uvedene casy, simulacia by mala fungovat aj s inymi casmi
- - build (console): gcc lovci_a_zberaci.c -o lovci_a_zberaci -lpthread
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- #include <semaphore.h>
- #include <unistd.h>
- // signal na zastavenie simulacie
- int stoj = 0;
- pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
- pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
- int lovci = 0;
- int zberaci = 0;
- int lovci_darov = 0;
- int zberaci_darov = 0;
- // lovec
- void lov(int lovec_id) {
- printf("[LOVEC %d] - je na love... \n", lovec_id);
- sleep(6);
- }
- void dar_lov(int lovec_id) {
- pthread_mutex_lock(&mut);
- while (lovci >= 2 || zberaci != 0)
- pthread_cond_wait(&cond, &mut);
- lovci++;
- printf("[LOVEC %d] - daruje ulovok... \n", lovec_id);
- sleep(2);
- lovci_darov++;
- lovci--;
- pthread_cond_broadcast(&cond);
- pthread_mutex_unlock(&mut);
- }
- void *lovec(void *ptr) {
- int lovec_id = (int *) ptr;
- while(!stoj) {
- lov(lovec_id);
- dar_lov(lovec_id);
- }
- pthread_exit(0);
- }
- // zberac
- void zber(int zberac_id) {
- printf("[ZBERAC %d] - je na zbere... \n", zberac_id);
- sleep(4);
- }
- void dar_zber(int zberac_id) {
- pthread_mutex_lock(&mut);
- while (zberaci >= 3 || lovci != 0)
- pthread_cond_wait(&cond, &mut);
- zberaci++;
- printf("[ZBERAC %d] - daruje zber... \n", zberac_id);
- sleep(1);
- zberaci_darov++;
- zberaci--;
- pthread_cond_broadcast(&cond);
- pthread_mutex_unlock(&mut);
- }
- void *zberac(void *ptr) {
- int zberac_id = (int *) ptr;
- // pokial nie je zastaveny
- while(!stoj) {
- zber(zberac_id);
- dar_zber(zberac_id);
- }
- pthread_exit(0);
- }
- int main(void) {
- int i;
- pthread_t lovci[6];
- pthread_t zberaci[12];
- for (i=0;i<6;i++) pthread_create( &lovci[i], NULL, &lovec, (void *) i);
- for (i=0;i<12;i++) pthread_create( &zberaci[i], NULL, &zberac, (void *) i);
- sleep(30);
- stoj = 1;
- pthread_cond_broadcast(&cond);
- for (i=0;i<6;i++) pthread_join( lovci[i], NULL);
- for (i=0;i<12;i++) pthread_join( zberaci[i], NULL);
- printf("\n==========================\n");
- printf("Lovci darovali: %d\n", lovci_darov);
- printf("Zberaci darovali: %d\n", zberaci_darov);
- exit(EXIT_SUCCESS);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement