Как инициализировать двоичный семафор в C - PullRequest
8 голосов
/ 20 сентября 2011

На справочной странице кажется, что даже если вы инициализируете семафор значением 1:

sem_init(&mySem, 0, 1);

Это может быть увеличено до значения больше 1 с несколькими вызовами на

sem_post(&mySem);

Но в этом примере кода комментарий выглядит иначе:

sem_init(&mutex, 0, 1);      /* initialize mutex to 1 - binary semaphore */

Можно ли инициализировать строго двоичный семафор в C?

Примечание: причина для того, чтобы сделать это вместо использования мьютекса в этом случае, заключается в том, что sem_post и sem_wait могут вызываться разными потоками.

1 Ответ

9 голосов
/ 20 сентября 2011

Если вам нужен строго двоичный семафор в Linux, я предлагаю создать его из мьютексов и условных переменных.

struct binary_semaphore {
    pthread_mutex_t mutex;
    pthread_cond_t cvar;
    int v;
};

void mysem_post(struct binary_semaphore *p)
{
    pthread_mutex_lock(&p->mutex);
    if (p->v == 1)
        /* error */
    p->v += 1;
    pthread_cond_signal(&p->cvar);
    pthread_mutex_unlock(&p->mutex);
}

void mysem_wait(struct binar_semaphore *p)
{
    pthread_mutex_lock(&p->mutex);
    while (!p->v)
        pthread_cond_wait(&p->cvar, &p->mutex);
    p->v -= 1;
    pthread_mutex_unlock(&p->mutex);
}
...