--- trunk/livstidsfanger.c 2014/11/07 08:04:18 5 +++ trunk/livstidsfanger.c 2014/11/07 13:50:02 10 @@ -1,5 +1,5 @@ // Programmet bruker ISO C 2011 (ISO/IEC 9899:2011) og Pthreads (IEEE Std 1003.1c-1995). -*- coding: utf-8 -*- -// Løsning laget av Trond Endrestøl , 2014-11-06. +// Løsning programmert av Trond Endrestøl , 2014-11-06. // $Ximalas$ @@ -10,6 +10,7 @@ #include #include #include +#include #include #if __STDC_VERSION__ >= 201112L @@ -41,7 +42,11 @@ noreturn int main(int argc, char **argv) atexit(visResultater); signal(SIGINT, signalhandler); +#ifdef __FreeBSD__ srandomdev(); +#else + srandom((unsigned int)time(NULL)); +#endif memset((void *)&antallBesok, 0, sizeof(antallBesok)); brytere[0] = random() & 1; @@ -49,6 +54,10 @@ noreturn int main(int argc, char **argv) tellendeLivstidsfange = random() % ANTALL_LIVSTIDSFANGER; + printf("bryter %u er i utgangspunktet vippet %s\n", 1U, brytere[0] == true ? "opp" : "ned"); + printf("bryter %u er i utgangspunktet vippet %s\n", 2U, brytere[1] == true ? "opp" : "ned"); + printf("livstidsfange %zu er utpekt som den tellende livstidsfange\n\n", tellendeLivstidsfange + 1); + puts("maintråden venter på å få låst mutex"); pthread_mutex_lock(&mutex); puts("mutex er låst av maintråden"); @@ -60,7 +69,7 @@ noreturn int main(int argc, char **argv) fprintf(stderr, "%s: pthread_create(&tid, NULL, livstidsfange, (void *)%2zu) = %s (%d)\n", argv[0], i, strerror(errno), errno); - exit(1); + _exit(1); } // if } // for @@ -107,7 +116,7 @@ noreturn void *livstidsfange(void *arg) // Utføre selve simuleringen ved å sjekke brytere, m.m. antallBesok[i]++; - printf("livstidsfange %2zu har besøkt rommet %u ganger\n", i + 1, antallBesok[i]); + printf("livstidsfange %2zu har besøkt rommet %u gang%s\n", i + 1, antallBesok[i], antallBesok[i] == 1 ? "" : "er"); if (i == tellendeLivstidsfange) { if (brytere[0] == false) { @@ -116,7 +125,7 @@ noreturn void *livstidsfange(void *arg) } // if else { brytere[0] = !brytere[0]; - printf("livstidsfange %2zu vipper %s bryter 1\n", i + 1, brytere[0] == 1U ? "opp" : "ned"); + printf("livstidsfange %2zu vipper %s bryter 1\n", i + 1, brytere[0] == true ? "opp" : "ned"); if (forrigeGangErGyldig == true && forrigeGang == false) { antallLivstidsfanger++; @@ -171,12 +180,14 @@ void visResultater(void) fflush(stdout); fflush(stderr); fflush(stdout); - puts(""); + puts("\nResultater:\n"); - printf("livstidsfange %2zu er den tellende livstidsfangen\n\n", tellendeLivstidsfange + 1); + printf("bryter %u er ved avslutning vippet %s\n", 1U, brytere[0] == true ? "opp" : "ned"); + printf("bryter %u er ved avslutning vippet %s\n", 2U, brytere[1] == true ? "opp" : "ned"); + printf("livstidsfange %2zu var den tellende livstidsfangen\n\n", tellendeLivstidsfange + 1); for (i = 0; i < ANTALL_LIVSTIDSFANGER; i++) { - printf("livstidsfange %2zu: antall besøk = %u\n", i + 1, antallBesok[i]); + printf("livstidsfange %2zu: antall besøk: %u\n", i + 1, antallBesok[i]); } // for fflush(stdout);