#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>
sem_t semaphore;
void* process(void* arg) {
sem_wait(&semaphore);
printf("Process %d is in critical section\n", *(int*)arg
); sleep(1); // simulate work
printf("Process %d is leaving critical section\n", *(int*)arg
); sem_post
(&semaphore
); return NULL;
}
int main() {
pthread_t t1, t2;
int id1 = 1, id2 = 2;
sem_init(&semaphore, 0, 1);
pthread_create(&t1, NULL, process, &id1);
pthread_create(&t2, NULL, process, &id2);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
sem_destroy(&semaphore);
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4gCiNpbmNsdWRlPHB0aHJlYWQuaD4KICNpbmNsdWRlPHNlbWFwaG9yZS5oPgogc2VtX3Qgc2VtYXBob3JlOyAKdm9pZCogcHJvY2Vzcyh2b2lkKiBhcmcpIHsgICAKICBzZW1fd2FpdCgmc2VtYXBob3JlKTsgCiAgcHJpbnRmKCJQcm9jZXNzICVkIGlzIGluIGNyaXRpY2FsIHNlY3Rpb25cbiIsICooaW50KilhcmcpOyAgICAgIAogc2xlZXAoMSk7IC8vIHNpbXVsYXRlIHdvcmsgICAgICAKcHJpbnRmKCJQcm9jZXNzICVkIGlzIGxlYXZpbmcgY3JpdGljYWwgc2VjdGlvblxuIiwgKihpbnQqKWFyZyk7IHNlbV9wb3N0KCZzZW1hcGhvcmUpOyAgIApyZXR1cm4gTlVMTDsgCn0gCmludCBtYWluKCkgeyAgIAogIHB0aHJlYWRfdCB0MSwgdDI7ICAgIAogaW50IGlkMSA9IDEsIGlkMiA9IDI7ICAgCiAgc2VtX2luaXQoJnNlbWFwaG9yZSwgMCwgMSk7ICAKICBwdGhyZWFkX2NyZWF0ZSgmdDEsIE5VTEwsIHByb2Nlc3MsICZpZDEpOyAgIAogIHB0aHJlYWRfY3JlYXRlKCZ0MiwgTlVMTCwgcHJvY2VzcywgJmlkMik7ICAgICAKICBwdGhyZWFkX2pvaW4odDEsIE5VTEwpOyAgICAgCiAgcHRocmVhZF9qb2luKHQyLCBOVUxMKTsgICAgCiAgc2VtX2Rlc3Ryb3koJnNlbWFwaG9yZSk7IAogICAgcmV0dXJuIDA7ICAKICAgIAp9IAogCg==