It doesn’t violate any rules… Imagine both the “speaker” and the “text” are being updated by separate threads. A program that would eventually display the behavior in this meme is simple, and I’m a bit embarrassed to have written it because of this comment:
#include<pthread.h>#include<stdio.h>char* speakers[] = {
"Alice",
"Bob"
};
int speaker = 0;
void* change_speaker(void* arg){
(void)arg;
for (;;) {
speaker = speaker == 0 ? 1 : 0;
}
}
char* texts[] = {
"Hi Bob",
"Hi Alice, what's up?",
"Not much Bob",
};
int text = 0;
void* change_text(void* arg){
(void)arg;
for (;;) {
switch (text) {
case0:
text = 1;
break;
case1:
text = 2;
break;
case2:
text = 0;
break;
}
}
}
intmain(int argc, char* argv[]){
pthread_t speaker_swapper, text_swapper;
pthread_create(&text_swapper, NULL, change_text, NULL);
pthread_create(&speaker_swapper, NULL, change_speaker, NULL);
for (int i = 0; i < 3; ++i) {
printf("%s: %s\n", speakers[speaker], texts[text]);
}
}
It doesn’t violate any rules… Imagine both the “speaker” and the “text” are being updated by separate threads. A program that would eventually display the behavior in this meme is simple, and I’m a bit embarrassed to have written it because of this comment:
#include <pthread.h> #include <stdio.h> char* speakers[] = { "Alice", "Bob" }; int speaker = 0; void* change_speaker(void* arg) { (void)arg; for (;;) { speaker = speaker == 0 ? 1 : 0; } } char* texts[] = { "Hi Bob", "Hi Alice, what's up?", "Not much Bob", }; int text = 0; void* change_text(void* arg) { (void)arg; for (;;) { switch (text) { case 0: text = 1; break; case 1: text = 2; break; case 2: text = 0; break; } } } int main(int argc, char* argv[]) { pthread_t speaker_swapper, text_swapper; pthread_create(&text_swapper, NULL, change_text, NULL); pthread_create(&speaker_swapper, NULL, change_speaker, NULL); for (int i = 0; i < 3; ++i) { printf("%s: %s\n", speakers[speaker], texts[text]); } }