Использование объектно-ориентированного семафора в C ++ - PullRequest
2 голосов
/ 26 января 2011

Я знаю, как использовать семафоры Unix в C. Перед их использованием я должен вызвать функцию-конструктор с именем sem_init, а после их использования мне нужно вызвать функцию, похожую на деструктор sem_destroy.

Я знаю, что могу продолжать делать это в C ++ из-за его обратной совместимости с C, но есть ли в C ++ реальный объектно-ориентированный способ использования семафоров?

Ответы [ 3 ]

2 голосов
/ 26 января 2011

Вы должны использовать библиотеки Boost (если вы их не знаете, они предназначены для C ++, как JDK для Java).

Boost.Interprocess - библиотека, необходимая для вашего вопроса. Он обеспечивает абстракцию механизмов межпроцессного взаимодействия.

Этот является примером использования семафоров.

2 голосов
/ 26 января 2011

Если вы действительно настаиваете на использовании семафоров 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;
}
0 голосов
/ 26 января 2011
...