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

Diff of /trunk/livstidsfanger.c

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

Revision 8 by trond, 2014-11-07T09:29:54Z 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 programmert 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    
6  #include <errno.h>  #include <errno.h>
7  #include <pthread.h>  #include <pthread.h>
8  #include <signal.h>  #include <signal.h>
9  #include <stdbool.h>  #include <stdbool.h>
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
17  #include <stdnoreturn.h>  #include <stdnoreturn.h>
18  #else  #else
19  #define noreturn  #define noreturn
20  #endif  #endif
21    
22  #define ANTALL_LIVSTIDSFANGER 19U  #define ANTALL_LIVSTIDSFANGER 19U
23    
24  static unsigned antallBesok[ANTALL_LIVSTIDSFANGER];  static unsigned antallBesok[ANTALL_LIVSTIDSFANGER];
25    
26  static size_t tellendeLivstidsfange;  static size_t tellendeLivstidsfange;
27  static unsigned antallLivstidsfanger;  static unsigned antallLivstidsfanger;
28    
# Line 29  noreturn int main(int argc, char **argv) Line 30  noreturn int main(int argc, char **argv)
30  static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;  static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
31  static bool brytere[2U];  static bool brytere[2U];
32    
33  noreturn void *livstidsfange(void *arg);  noreturn void *livstidsfange(void *arg);
34  void visResultater(void);  void visResultater(void);
35  void signalhandler(int sig);  void signalhandler(int sig);
36    
37  noreturn int main(int argc, char **argv)  noreturn int main(int argc, char **argv)
38  {  {
39    size_t i;    size_t i;
40    pthread_t tid = pthread_self();    pthread_t tid = pthread_self();
41    
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;
53    brytere[1] = random() & 1;    brytere[1] = random() & 1;
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");    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");    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);    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");
64    
65    for (i = 0; i < ANTALL_LIVSTIDSFANGER; i++) {    for (i = 0; i < ANTALL_LIVSTIDSFANGER; i++) {
66      printf("maintråden oppretter livstidsfange %2zu\n", i + 1);      printf("maintråden oppretter livstidsfange %2zu\n", i + 1);
67    
68      if ( (errno = pthread_create(&tid, NULL, livstidsfange, (void *)i)) != 0) {      if ( (errno = pthread_create(&tid, NULL, livstidsfange, (void *)i)) != 0) {
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    
76    // maintråden påtar seg rolla som fengselsdirektøren.    // maintråden påtar seg rolla som fengselsdirektøren.
77    while (1) {    while (1) {
78      puts("fengselsdirektøren låser opp mutex");      puts("fengselsdirektøren låser opp mutex");
79      pthread_mutex_unlock(&mutex);      pthread_mutex_unlock(&mutex);
80      puts("mutex er låst opp av fengselsdirektøren");      puts("mutex er låst opp av fengselsdirektøren");
81    
82      puts("fengselsdirektøren signalerer livstidsfangene");      puts("fengselsdirektøren signalerer livstidsfangene");
83      pthread_cond_signal(&cond);      pthread_cond_signal(&cond);
84      puts("signal er sendt fra fengselsdirektøren");      puts("signal er sendt fra fengselsdirektøren");
85    
86      puts("fengselsdirektøren venter på å få låst mutex");      puts("fengselsdirektøren venter på å få låst mutex");
87      pthread_mutex_lock(&mutex);      pthread_mutex_lock(&mutex);


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

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