#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
sem_t odd_sem, even_sem;
int limit;
void* print_odd(void* arg)
{
for(int i = 1; i <= limit; i += 2)
{
sem_wait(&odd_sem);
sem_post(&even_sem);
}
return NULL;
}
void* print_even(void* arg)
{
for(int i = 2; i <= limit; i += 2)
{
sem_wait(&even_sem);
sem_post(&odd_sem);
}
return NULL;
}
int main()
{
pthread_t t1, t2;
sem_init(&odd_sem, 0, 1);
sem_init(&even_sem, 0, 0);
pthread_create(&t1, NULL, print_odd, NULL);
pthread_create(&t2, NULL, print_even, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
sem_destroy(&odd_sem);
sem_destroy(&even_sem);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4Kc2VtX3Qgb2RkX3NlbSwgZXZlbl9zZW07CmludCBsaW1pdDsKdm9pZCogcHJpbnRfb2RkKHZvaWQqIGFyZykKewogICAgZm9yKGludCBpID0gMTsgaSA8PSBsaW1pdDsgaSArPSAyKQogICAgewogICAgICAgIHNlbV93YWl0KCZvZGRfc2VtKTsKICAgICAgICBwcmludGYoIiVkICIsIGkpOwogICAgICAgIHNlbV9wb3N0KCZldmVuX3NlbSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQp2b2lkKiBwcmludF9ldmVuKHZvaWQqIGFyZykKewogICAgZm9yKGludCBpID0gMjsgaSA8PSBsaW1pdDsgaSArPSAyKQogICAgewogICAgICAgIHNlbV93YWl0KCZldmVuX3NlbSk7CiAgICAgICAgcHJpbnRmKCIlZCAiLCBpKTsKICAgICAgICBzZW1fcG9zdCgmb2RkX3NlbSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQppbnQgbWFpbigpCnsKICAgIHB0aHJlYWRfdCB0MSwgdDI7CiAgICBwcmludGYoIkVudGVyIGxpbWl0OiAiKTsKICAgIHNjYW5mKCIlZCIsICZsaW1pdCk7CiAgICBzZW1faW5pdCgmb2RkX3NlbSwgMCwgMSk7CiAgICBzZW1faW5pdCgmZXZlbl9zZW0sIDAsIDApOwogICAgcHRocmVhZF9jcmVhdGUoJnQxLCBOVUxMLCBwcmludF9vZGQsIE5VTEwpOwogICAgcHRocmVhZF9jcmVhdGUoJnQyLCBOVUxMLCBwcmludF9ldmVuLCBOVUxMKTsKICAgIHB0aHJlYWRfam9pbih0MSwgTlVMTCk7CiAgICBwdGhyZWFkX2pvaW4odDIsIE5VTEwpOwogICAgc2VtX2Rlc3Ryb3koJm9kZF9zZW0pOwogICAgc2VtX2Rlc3Ryb3koJmV2ZW5fc2VtKTsKCiAgICByZXR1cm4gMDsKfQ==