If you really insist on using POSIX semaphores rather than Boost, you can, of course, wrap sem_t in a class:
class Semaphore { sem_t sem; public: Semaphore(int shared, unsigned value) { sem_init(&sem, shared, value); } ~Semaphore() { sem_destroy(&sem); } int wait() { return sem_wait(&sem); } int try_wait() { return sem_trywait(&sem); } int unlock() { return sem_post(&sem); } };
Exercise for the reader. You might want to add exceptions instead of C-style error codes and possibly other functions. In addition, this class must not be copyable. The easiest way to achieve this is to inherit from boost::noncopyable ;)
Edit : as @Ringding's remark, making a loop on an EINTR would be very reasonable.
int Semaphore::wait() { int r; do { r = sem_wait(&sem); } while (r == -1 && errno == EINTR); return r; }
source share