#include <iostream>
#include <semaphore.h>
using namespace std;
int main() {
sem_t my_sem;
int val,ec;
ec=sem_init(&my_sem, 0, 1);
if (ec)
cout<<"Error "<<ec<<endl;
else {
sem_getvalue(&my_sem, &val);
cout<<val<<endl;
sem_post(&my_sem);
sem_getvalue(&my_sem, &val);
cout<<val<<" !!!"<<endl;
sem_wait(&my_sem);
sem_getvalue(&my_sem, &val);
cout<<val<<endl;
sem_wait(&my_sem);
sem_getvalue(&my_sem, &val);
cout<<val<<endl;
sem_trywait(&my_sem); // ok, here we are in a single thread, so it's same thread
if (ec) {
sem_getvalue(&my_sem, &val);
cout<<val<<endl;
}
else cout << "Couldn't acquire"<<endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2VtYXBob3JlLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpIHsKCXNlbV90IG15X3NlbTsKCWludCB2YWwsZWM7IAoJZWM9c2VtX2luaXQoJm15X3NlbSwgMCwgMSk7CglpZiAoZWMpIAoJICAgY291dDw8IkVycm9yICI8PGVjPDxlbmRsOyAKCWVsc2UgewoJICBzZW1fZ2V0dmFsdWUoJm15X3NlbSwgJnZhbCk7CgkgIGNvdXQ8PHZhbDw8ZW5kbDsgCgkgIHNlbV9wb3N0KCZteV9zZW0pOyAKCSAgc2VtX2dldHZhbHVlKCZteV9zZW0sICZ2YWwpOwoJICBjb3V0PDx2YWw8PCIgICAhISEiPDxlbmRsOyAKCSAgc2VtX3dhaXQoJm15X3NlbSk7IAoJICBzZW1fZ2V0dmFsdWUoJm15X3NlbSwgJnZhbCk7CgkgIGNvdXQ8PHZhbDw8ZW5kbDsgCgkgIHNlbV93YWl0KCZteV9zZW0pOyAKCSAgc2VtX2dldHZhbHVlKCZteV9zZW0sICZ2YWwpOwoJICBjb3V0PDx2YWw8PGVuZGw7IAoJICBzZW1fdHJ5d2FpdCgmbXlfc2VtKTsgICAvLyBvaywgIGhlcmUgd2UgYXJlIGluIGEgc2luZ2xlIHRocmVhZCwgc28gaXQncyBzYW1lIHRocmVhZAoJICBpZiAoZWMpIHsKCSAgICBzZW1fZ2V0dmFsdWUoJm15X3NlbSwgJnZhbCk7CgkgICAgY291dDw8dmFsPDxlbmRsOwoJICB9CgkgIGVsc2UgY291dCA8PCAiQ291bGRuJ3QgYWNxdWlyZSI8PGVuZGw7IAoJfQoJcmV0dXJuIDA7Cn0=