--- trunk/livstidsfanger.c 2014/11/07 07:51:12 3 +++ trunk/livstidsfanger.c 2014/11/07 07:56:17 4 @@ -14,7 +14,7 @@ #if __STDC_VERSION__ >= 201112L #include #else -#define noreturn /**/ +#define noreturn #endif #define ANTALL_LIVSTIDSFANGER 19U @@ -26,18 +26,16 @@ static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; - -// Ingen må forandre på bryterne uten å ha låst mutex først. static unsigned brytere[2U]; noreturn void *livstidsfange(void *arg); void visResultater(void); void signalhandler(int sig); -noreturn int main (int argc, char **argv) +noreturn int main(int argc, char **argv) { size_t i; - pthread_t tid = 0; + pthread_t tid = pthread_self(); atexit(visResultater); signal(SIGINT, signalhandler); @@ -57,7 +55,7 @@ noreturn int main (int argc, char **argv) for (i = 0; i < ANTALL_LIVSTIDSFANGER; i++) { printf("maintråden oppretter livstidsfange %2zu\n", i + 1); - if ( ( errno = pthread_create(&tid, NULL, livstidsfange, (void *)i)) != 0) { + if ( (errno = pthread_create(&tid, NULL, livstidsfange, (void *)i)) != 0) { fprintf(stderr, "%s: pthread_create(&tid, NULL, livstidsfange, (void *)%2zu) = %s (%d)\n", argv[0], i, strerror(errno), errno); @@ -113,7 +111,7 @@ noreturn void *livstidsfange(void *arg) if (i == tellendeLivstidsfange) { if (brytere[0] == 0U) { printf("livstidsfange %2zu ser at bryter 1 er nede og vipper opp bryter 1\n", i + 1); - brytere[0] = 1U; + brytere[0] = 1U; } // if else { brytere[0] = !brytere[0]; @@ -127,7 +125,7 @@ noreturn void *livstidsfange(void *arg) printf("livstidsfange %2zu avslutter simuleringen\n", i + 1); exit(0); } // if - } // if + } // if forrigeGangErGyldig = 1U; forrigeGang = brytere[0]; @@ -149,22 +147,18 @@ noreturn void *livstidsfange(void *arg) printf("livstidsfange %2zu vipper %s bryter 1\n", i + 1, brytere[0] == 1U ? "opp" : "ned"); harVippetBryter1 = 1U; - } // if + } // if else { brytere[1] = !brytere[1]; printf("livstidsfange %2zu vipper %s bryter 2\n", i + 1, brytere[1] == 1U ? "opp" : "ned"); - } // else + } // else } // else } // else - // Signalere fengselsdirektøren (eller en vilkårlig livstidsfange). + // Tusle ut av rommet. printf("livstidsfange %2zu låser opp mutex\n", i + 1); pthread_mutex_unlock(&mutex); printf("livstidsfange %2zu har låst opp mutex\n", i + 1); - - printf("livstidsfange %2zu signalerer de andre trådene\n", i + 1); - pthread_cond_signal(&cond); - printf("livstidsfange %2zu har gitt signal til de andre trådene\n", i + 1); } // while } // livstidsfange() @@ -191,8 +185,7 @@ void signalhandler(int sig) void signalhandler(int sig) { if (sig == SIGINT) { - visResultater(); - _exit(1); + exit(1); } // if } // signalhandler()