#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t mutex;
int shared = 0;
void* work(void* arg)
{
sem_wait(&mutex);
shared++;
printf("Thread %d entered critical section. Shared = %d\n", *(int*)arg
, shared
); sleep(1);
printf("Thread %d leaving critical section.\n", *(int*)arg
); sem_post(&mutex);
return NULL;
}
int main()
{
pthread_t t1, t2;
int id1 = 1, id2 = 2;
sem_init(&mutex, 0, 1);
pthread_create(&t1, NULL, work, &id1);
pthread_create(&t2, NULL, work, &id2);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
sem_destroy(&mutex);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKc2VtX3QgbXV0ZXg7CmludCBzaGFyZWQgPSAwOwoKdm9pZCogd29yayh2b2lkKiBhcmcpCnsKICAgIHNlbV93YWl0KCZtdXRleCk7CiAgICBzaGFyZWQrKzsKICAgIHByaW50ZigiVGhyZWFkICVkIGVudGVyZWQgY3JpdGljYWwgc2VjdGlvbi4gU2hhcmVkID0gJWRcbiIsICooaW50KilhcmcsIHNoYXJlZCk7CiAgICBzbGVlcCgxKTsKICAgIHByaW50ZigiVGhyZWFkICVkIGxlYXZpbmcgY3JpdGljYWwgc2VjdGlvbi5cbiIsICooaW50KilhcmcpOwogICAgc2VtX3Bvc3QoJm11dGV4KTsKICAgIHJldHVybiBOVUxMOwp9CgppbnQgbWFpbigpCnsKICAgIHB0aHJlYWRfdCB0MSwgdDI7CiAgICBpbnQgaWQxID0gMSwgaWQyID0gMjsKCiAgICBzZW1faW5pdCgmbXV0ZXgsIDAsIDEpOwoKICAgIHB0aHJlYWRfY3JlYXRlKCZ0MSwgTlVMTCwgd29yaywgJmlkMSk7CiAgICBwdGhyZWFkX2NyZWF0ZSgmdDIsIE5VTEwsIHdvcmssICZpZDIpOwoKICAgIHB0aHJlYWRfam9pbih0MSwgTlVMTCk7CiAgICBwdGhyZWFkX2pvaW4odDIsIE5VTEwpOwoKICAgIHNlbV9kZXN0cm95KCZtdXRleCk7CiAgICByZXR1cm4gMDsKfQ==