#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t mutex;
int shared = 0;
void* critical_section(void* arg)
{
sem_wait(&mutex);
int temp = shared;
temp++;
sleep(1);
shared = temp;
printf("Thread %ld: shared = %d\n", (long)arg
, shared
); sem_post(&mutex);
return NULL;
}
int main()
{
pthread_t t1, t2;
sem_init(&mutex, 0, 1);
pthread_create(&t1, NULL, critical_section, (void*)1);
pthread_create(&t2, NULL, critical_section, (void*)2);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
sem_destroy(&mutex);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKc2VtX3QgbXV0ZXg7CmludCBzaGFyZWQgPSAwOwoKdm9pZCogY3JpdGljYWxfc2VjdGlvbih2b2lkKiBhcmcpCnsKICAgIHNlbV93YWl0KCZtdXRleCk7CiAgICBpbnQgdGVtcCA9IHNoYXJlZDsKICAgIHRlbXArKzsKICAgIHNsZWVwKDEpOwogICAgc2hhcmVkID0gdGVtcDsKICAgIHByaW50ZigiVGhyZWFkICVsZDogc2hhcmVkID0gJWRcbiIsIChsb25nKWFyZywgc2hhcmVkKTsKICAgIHNlbV9wb3N0KCZtdXRleCk7CiAgICByZXR1cm4gTlVMTDsKfQoKaW50IG1haW4oKQp7CiAgICBwdGhyZWFkX3QgdDEsIHQyOwogICAgc2VtX2luaXQoJm11dGV4LCAwLCAxKTsKCiAgICBwdGhyZWFkX2NyZWF0ZSgmdDEsIE5VTEwsIGNyaXRpY2FsX3NlY3Rpb24sICh2b2lkKikxKTsKICAgIHB0aHJlYWRfY3JlYXRlKCZ0MiwgTlVMTCwgY3JpdGljYWxfc2VjdGlvbiwgKHZvaWQqKTIpOwoKICAgIHB0aHJlYWRfam9pbih0MSwgTlVMTCk7CiAgICBwdGhyZWFkX2pvaW4odDIsIE5VTEwpOwoKICAgIHNlbV9kZXN0cm95KCZtdXRleCk7CiAgICByZXR1cm4gMDsKfQ==