Use the following commands to compile and link the examples:
$ gcc -std=c17 -pedantic-errors -O0 -g -o problem problem.c -lpthread
$ gcc -std=c17 -pedantic-errors -O0 -g -o peterson0 peterson0.c -lpthread
#include <pthread.h> | |
#include <stdbool.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#define PING "ping" | |
#define PONG "pong" | |
void critical(const char * str) { | |
size_t len = strlen(str); | |
for (size_t i = 0; i < len; ++i) { | |
printf("%c", str[i]); | |
} // for | |
printf("\n"); | |
} // str | |
int getid(const char * msg) { | |
if (strcmp(msg, PING) == 0) return 0; | |
if (strcmp(msg, PONG) == 0) return 1; | |
} // getid | |
volatile bool flag [2] = { false, false }; | |
volatile int turn; | |
void * pingpong(void * p) { | |
char * msg = (char *) p; | |
int id = getid(msg); | |
for (;;) { | |
flag[id] = true; | |
turn = 1-id; | |
while (flag[1-id] && turn == (1-id)); | |
critical(msg); | |
flag[id] = false; | |
} // for | |
} // pingpong | |
int main() { | |
setvbuf(stdout, NULL, _IONBF, 0); | |
pthread_t ping; | |
pthread_t pong; | |
pthread_create(&ping, NULL, pingpong, PING); | |
pthread_create(&pong, NULL, pingpong, PONG); | |
for(;;); | |
return 0; | |
} // main |
#include <pthread.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#define PING "ping" | |
#define PONG "pong" | |
void critical(const char * str) { | |
size_t len = strlen(str); | |
for (size_t i = 0; i < len; ++i) { | |
printf("%c", str[i]); | |
} // for | |
printf("\n"); | |
} // critical | |
void * pingpong(void * p) { | |
char * msg = (char *) p; | |
for (;;) { | |
critical(msg); | |
} // for | |
} // pingpong | |
int main() { | |
setvbuf(stdout, NULL, _IONBF, 0); | |
pthread_t ping; | |
pthread_t pong; | |
pthread_create(&ping, NULL, pingpong, PING); | |
pthread_create(&pong, NULL, pingpong, PONG); | |
for(;;); | |
return 0; | |
} // main |