1 |
// Programmet bruker ISO C 2011 (ISO/IEC 9899:2011) og Pthreads (IEEE Std 1003.1c-2001). -*- coding: utf-8 -*- |
// Programmet bruker ISO C 2011 (ISO/IEC 9899:2011) og Pthreads (IEEE Std 1003.1c-2001). -*- 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 |
#if __STDC_VERSION__ < 199901L |
#if __STDC_VERSION__ < 199901L |
7 |
#error det er tvilsomt om du får kompilert denne kildekoden med så gammel C-kompilator |
#error det er tvilsomt om du får kompilert denne kildekoden med så gammel C-kompilator |
8 |
#endif |
#endif |
9 |
|
|
10 |
#include <errno.h> |
#include <errno.h> |
11 |
#include <pthread.h> |
#include <pthread.h> |
12 |
|
#include <sched.h> |
13 |
#include <signal.h> |
#include <signal.h> |
14 |
#include <stdbool.h> |
#include <stdbool.h> |
15 |
#include <stdio.h> |
#include <stdio.h> |
16 |
#include <stdlib.h> |
#include <stdlib.h> |
17 |
#include <string.h> |
#include <string.h> |
18 |
#include <time.h> |
#include <time.h> |
19 |
#include <unistd.h> |
#include <unistd.h> |
20 |
|
|
21 |
#if _POSIX_THREADS < 200112L |
#if _POSIX_THREADS < 200112L |
22 |
#error her mangler det støtte for POSIX Threads anno 2001 |
#error her mangler det støtte for POSIX Threads anno 2001 |
23 |
#endif |
#endif |
24 |
|
|
25 |
#if __STDC_VERSION__ >= 201112L |
#if __STDC_VERSION__ >= 201112L |
26 |
#include <stdnoreturn.h> |
#include <stdnoreturn.h> |
27 |
#else |
#else |
170 |
printf("livstidsfange %2zu vipper %s bryter 1\n", i + 1, brytere[0] == true ? "opp" : "ned"); |
printf("livstidsfange %2zu vipper %s bryter 1\n", i + 1, brytere[0] == true ? "opp" : "ned"); |
171 |
|
|
172 |
harVippetBryter1 = true; |
harVippetBryter1 = true; |
173 |
} // if |
} // if |
174 |
else { |
else { |
175 |
brytere[1] = !brytere[1]; |
brytere[1] = !brytere[1]; |
176 |
printf("livstidsfange %2zu vipper %s bryter 2\n", i + 1, brytere[1] == true ? "opp" : "ned"); |
printf("livstidsfange %2zu vipper %s bryter 2\n", i + 1, brytere[1] == true ? "opp" : "ned"); |
177 |
} // else |
} // else |
178 |
} // else |
} // else |
179 |
} // else |
} // else |
180 |
|
|
181 |
// Tusle ut av rommet. |
// Tusle ut av rommet. |
182 |
printf("livstidsfange %2zu låser opp mutex\n", i + 1); |
printf("livstidsfange %2zu låser opp mutex\n", i + 1); |
183 |
pthread_mutex_unlock(&mutex); |
pthread_mutex_unlock(&mutex); |
184 |
printf("livstidsfange %2zu har låst opp mutex\n", i + 1); |
printf("livstidsfange %2zu har låst opp mutex\n", i + 1); |
185 |
|
|
186 |
|
#ifdef _POSIX_PRIORITY_SCHEDULING |
187 |
|
sched_yield(); |
188 |
|
#endif |
189 |
} // while |
} // while |
190 |
} // livstidsfange() |
} // livstidsfange() |
191 |
|
|
192 |
void visResultater(void) |
void visResultater(void) |
193 |
{ |
{ |
194 |
size_t i; |
size_t i; |
195 |
|
|
196 |
fflush(stderr); |
fflush(stderr); |
197 |
fflush(stdout); |
fflush(stdout); |
198 |
|
|
199 |
puts("\nResultater:\n"); |
puts("\nResultater:\n"); |
200 |
|
|
201 |
printf("bryter %u er ved avslutning vippet %s\n", 1U, brytere[0] == true ? "opp" : "ned"); |
printf("bryter %u er ved avslutning vippet %s\n", 1U, brytere[0] == true ? "opp" : "ned"); |
202 |
printf("bryter %u er ved avslutning vippet %s\n", 2U, brytere[1] == true ? "opp" : "ned"); |
printf("bryter %u er ved avslutning vippet %s\n", 2U, brytere[1] == true ? "opp" : "ned"); |
203 |
printf("livstidsfange %2zu var den tellende livstidsfangen\n\n", tellendeLivstidsfange + 1); |
printf("livstidsfange %2zu var den tellende livstidsfangen\n\n", tellendeLivstidsfange + 1); |