#include <stdio.h>
#include <pthread.h>
#define MAX_NUM 50
int number = 1;
pthread_mutex_t lock;
pthread_cond_t cond;
int turn = 0; // 0, 1, 2 for three threads
void* print_numbers(void* arg) {
int thread_id = *(int*)arg;
while (1) {
pthread_mutex_lock(&lock);
while (turn != thread_id && number <= MAX_NUM) {
pthread_cond_wait(&cond, &lock);
}
if (number > MAX_NUM) {
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&lock);
break;
}
printf("Thread %d: %d\n", thread_id
+ 1, number
); number++;
turn = (turn + 1) % 3;
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&lock);
}
return NULL;
}
int main() {
pthread_t threads[3];
int ids[3] = {0, 1, 2};
pthread_mutex_init(&lock, NULL);
pthread_cond_init(&cond, NULL);
for (int i = 0; i < 3; i++) {
pthread_create(&threads[i], NULL, print_numbers, &ids[i]);
}
for (int i = 0; i < 3; i++) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&lock);
pthread_cond_destroy(&cond);
return 0;
}
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8cHRocmVhZC5oPgoKI2RlZmluZSBNQVhfTlVNIDUwCgppbnQgbnVtYmVyID0gMTsKcHRocmVhZF9tdXRleF90IGxvY2s7CnB0aHJlYWRfY29uZF90IGNvbmQ7CmludCB0dXJuID0gMDsgLy8gMCwgMSwgMiBmb3IgdGhyZWUgdGhyZWFkcwoKdm9pZCogcHJpbnRfbnVtYmVycyh2b2lkKiBhcmcpIHsKIGludCB0aHJlYWRfaWQgPSAqKGludCopYXJnOwoKIHdoaWxlICgxKSB7CiBwdGhyZWFkX211dGV4X2xvY2soJmxvY2spOwoKIHdoaWxlICh0dXJuICE9IHRocmVhZF9pZCAmJiBudW1iZXIgPD0gTUFYX05VTSkgewogcHRocmVhZF9jb25kX3dhaXQoJmNvbmQsICZsb2NrKTsKIH0KCiBpZiAobnVtYmVyID4gTUFYX05VTSkgewogcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmY29uZCk7CiBwdGhyZWFkX211dGV4X3VubG9jaygmbG9jayk7CiBicmVhazsKIH0KCiBwcmludGYoIlRocmVhZCAlZDogJWRcbiIsIHRocmVhZF9pZCArIDEsIG51bWJlcik7CiBudW1iZXIrKzsKIHR1cm4gPSAodHVybiArIDEpICUgMzsKCiBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZjb25kKTsKIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2NrKTsKIH0KCiByZXR1cm4gTlVMTDsKfQoKaW50IG1haW4oKSB7CiBwdGhyZWFkX3QgdGhyZWFkc1szXTsKIGludCBpZHNbM10gPSB7MCwgMSwgMn07CgogcHRocmVhZF9tdXRleF9pbml0KCZsb2NrLCBOVUxMKTsKIHB0aHJlYWRfY29uZF9pbml0KCZjb25kLCBOVUxMKTsKCiBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewogcHRocmVhZF9jcmVhdGUoJnRocmVhZHNbaV0sIE5VTEwsIHByaW50X251bWJlcnMsICZpZHNbaV0pOwogfQoKIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiBwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7CiB9CgogcHRocmVhZF9tdXRleF9kZXN0cm95KCZsb2NrKTsKIHB0aHJlYWRfY29uZF9kZXN0cm95KCZjb25kKTsKCiByZXR1cm4gMDsKfQo=