*** trunk/livstidsfanger.c 2014/11/07 07:51:12 3
--- trunk/livstidsfanger.c 2014/11/07 07:56:17 4
***************
*** 14,20 ****
#if __STDC_VERSION__ >= 201112L
#include <stdnoreturn.h>
#else
! #define noreturn /**/
#endif
#define ANTALL_LIVSTIDSFANGER 19U
--- 14,20 ----
#if __STDC_VERSION__ >= 201112L
#include <stdnoreturn.h>
#else
! #define noreturn
#endif
#define ANTALL_LIVSTIDSFANGER 19U
***************
*** 26,43 ****
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)
{
size_t i;
! pthread_t tid = 0;
atexit(visResultater);
signal(SIGINT, signalhandler);
--- 26,41 ----
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
static unsigned brytere[2U];
noreturn void *livstidsfange(void *arg);
void visResultater(void);
void signalhandler(int sig);
! noreturn int main(int argc, char **argv)
{
size_t i;
! pthread_t tid = pthread_self();
atexit(visResultater);
signal(SIGINT, signalhandler);
***************
*** 57,63 ****
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) {
fprintf(stderr,
"%s: pthread_create(&tid, NULL, livstidsfange, (void *)%2zu) = %s (%d)\n",
argv[0], i, strerror(errno), errno);
--- 55,61 ----
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) {
fprintf(stderr,
"%s: pthread_create(&tid, NULL, livstidsfange, (void *)%2zu) = %s (%d)\n",
argv[0], i, strerror(errno), errno);
***************
*** 113,119 ****
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;
} // if
else {
brytere[0] = !brytere[0];
--- 111,117 ----
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;
} // if
else {
brytere[0] = !brytere[0];
***************
*** 127,133 ****
printf("livstidsfange %2zu avslutter simuleringen\n", i + 1);
exit(0);
} // if
! } // if
forrigeGangErGyldig = 1U;
forrigeGang = brytere[0];
--- 125,131 ----
printf("livstidsfange %2zu avslutter simuleringen\n", i + 1);
exit(0);
} // if
! } // if
forrigeGangErGyldig = 1U;
forrigeGang = brytere[0];
***************
*** 149,170 ****
printf("livstidsfange %2zu vipper %s bryter 1\n", i + 1, brytere[0] == 1U ? "opp" : "ned");
harVippetBryter1 = 1U;
! } // if
else {
brytere[1] = !brytere[1];
printf("livstidsfange %2zu vipper %s bryter 2\n", i + 1, brytere[1] == 1U ? "opp" : "ned");
! } // else
} // else
} // else
! // Signalere fengselsdirektøren (eller en vilkårlig livstidsfange).
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()
--- 147,164 ----
printf("livstidsfange %2zu vipper %s bryter 1\n", i + 1, brytere[0] == 1U ? "opp" : "ned");
harVippetBryter1 = 1U;
! } // if
else {
brytere[1] = !brytere[1];
printf("livstidsfange %2zu vipper %s bryter 2\n", i + 1, brytere[1] == 1U ? "opp" : "ned");
! } // else
} // else
} // else
! // 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);
} // while
} // livstidsfange()
***************
*** 191,198 ****
void signalhandler(int sig)
{
if (sig == SIGINT) {
! visResultater();
! _exit(1);
} // if
} // signalhandler()
--- 185,191 ----
void signalhandler(int sig)
{
if (sig == SIGINT) {
! exit(1);
} // if
} // signalhandler()
|