/[livstidsfanger]/trunk/livstidsfanger.c
ViewVC logotype

Diff of /trunk/livstidsfanger.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 5 by trond, 2014-11-07T08:04:18Z Revision 10 by trond, 2014-11-07T13:50:02Z
# Line 1  Line 1 
1  // Programmet bruker ISO C 2011 (ISO/IEC 9899:2011) og Pthreads (IEEE Std 1003.1c-1995). -*- coding: utf-8 -*-  // Programmet bruker ISO C 2011 (ISO/IEC 9899:2011) og Pthreads (IEEE Std 1003.1c-1995). -*- coding: utf-8 -*-
2  // Løsning laget av Trond Endrestøl <Trond.Endrestol@ximalas.info>, 2014-11-06.  // Løsning programmert av Trond Endrestøl <Trond.Endrestol@ximalas.info>, 2014-11-06.
3    
4  // $Ximalas$  // $Ximalas$
5    
# Line 10  Line 10 
10  #include <stdio.h>  #include <stdio.h>
11  #include <stdlib.h>  #include <stdlib.h>
12  #include <string.h>  #include <string.h>
13    #include <time.h>
14  #include <unistd.h>  #include <unistd.h>
15    
16  #if __STDC_VERSION__ >= 201112L  #if __STDC_VERSION__ >= 201112L
# Line 41  noreturn int main(int argc, char **argv) Line 42  noreturn int main(int argc, char **argv)
42    atexit(visResultater);    atexit(visResultater);
43    signal(SIGINT, signalhandler);    signal(SIGINT, signalhandler);
44    
45    #ifdef __FreeBSD__
46    srandomdev();    srandomdev();
47    #else
48      srandom((unsigned int)time(NULL));
49    #endif
50    
51    memset((void *)&antallBesok, 0, sizeof(antallBesok));    memset((void *)&antallBesok, 0, sizeof(antallBesok));
52    brytere[0] = random() & 1;    brytere[0] = random() & 1;
# Line 49  noreturn int main(int argc, char **argv) Line 54  noreturn int main(int argc, char **argv)
54    
55    tellendeLivstidsfange = random() % ANTALL_LIVSTIDSFANGER;    tellendeLivstidsfange = random() % ANTALL_LIVSTIDSFANGER;
56    
57      printf("bryter %u er i utgangspunktet vippet %s\n", 1U, brytere[0] == true ? "opp" : "ned");
58      printf("bryter %u er i utgangspunktet vippet %s\n", 2U, brytere[1] == true ? "opp" : "ned");
59      printf("livstidsfange %zu er utpekt som den tellende livstidsfange\n\n", tellendeLivstidsfange + 1);
60    
61    puts("maintråden venter på å få låst mutex");    puts("maintråden venter på å få låst mutex");
62    pthread_mutex_lock(&mutex);    pthread_mutex_lock(&mutex);
63    puts("mutex er låst av maintråden");    puts("mutex er låst av maintråden");
# Line 60  noreturn int main(int argc, char **argv) Line 69  noreturn int main(int argc, char **argv)
69        fprintf(stderr,        fprintf(stderr,
70                "%s: pthread_create(&tid, NULL, livstidsfange, (void *)%2zu) = %s (%d)\n",                "%s: pthread_create(&tid, NULL, livstidsfange, (void *)%2zu) = %s (%d)\n",
71                argv[0], i, strerror(errno), errno);                argv[0], i, strerror(errno), errno);
72        exit(1);        _exit(1);
73      } // if      } // if
74    } // for    } // for
75    
# Line 107  noreturn void *livstidsfange(void *arg) Line 116  noreturn void *livstidsfange(void *arg)
116    
117      // Utføre selve simuleringen ved å sjekke brytere, m.m.      // Utføre selve simuleringen ved å sjekke brytere, m.m.
118      antallBesok[i]++;      antallBesok[i]++;
119      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");
120    
121      if (i == tellendeLivstidsfange) {      if (i == tellendeLivstidsfange) {
122        if (brytere[0] == false) {        if (brytere[0] == false) {
# Line 116  noreturn void *livstidsfange(void *arg) Line 125  noreturn void *livstidsfange(void *arg)
125        } // if        } // if
126        else {        else {
127          brytere[0] = !brytere[0];          brytere[0] = !brytere[0];
128          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");
129    
130          if (forrigeGangErGyldig == true && forrigeGang == false) {          if (forrigeGangErGyldig == true && forrigeGang == false) {
131            antallLivstidsfanger++;            antallLivstidsfanger++;
# Line 171  void visResultater(void) Line 180  void visResultater(void)
180    fflush(stdout);    fflush(stdout);
181    fflush(stderr);    fflush(stderr);
182    fflush(stdout);    fflush(stdout);
183    puts("");    puts("\nResultater:\n");
184    
185    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");
186      printf("bryter %u er ved avslutning vippet %s\n", 2U, brytere[1] == true ? "opp" : "ned");
187      printf("livstidsfange %2zu var den tellende livstidsfangen\n\n", tellendeLivstidsfange + 1);
188    
189    for (i = 0; i < ANTALL_LIVSTIDSFANGER; i++) {    for (i = 0; i < ANTALL_LIVSTIDSFANGER; i++) {
190      printf("livstidsfange %2zu: antall besøk = %u\n", i + 1, antallBesok[i]);      printf("livstidsfange %2zu: antall besøk: %u\n", i + 1, antallBesok[i]);
191    } // for    } // for
192    
193    fflush(stdout);    fflush(stdout);


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

svn@ximalas.info
ViewVC Help
Powered by ViewVC 1.3.0-beta1