Если вы действительно настаиваете на использовании семафоров POSIX, а не на Boost, вы, конечно, можете обернуть sem_t
в класс:
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); }
};
Упражнение для читателя: вы можете добавить исключения вместо CКоды ошибок в стиле и, возможно, другие функции.Кроме того, этот класс должен быть некопируемым.Самый простой способ добиться этого - наследовать от boost::noncopyable
;)
Редактировать : как замечает @Ringding, зацикливание на EINTR
было бы очень мудрым решением.
int Semaphore::wait()
{
int r;
do {
r = sem_wait(&sem);
} while (r == -1 && errno == EINTR);
return r;
}