一尘不染

如何在C中初始化二进制信号量

linux

手册页中,即使您将信号量初始化为一个值,也可能会出现:

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可能由不同的线程调用。


阅读 284

收藏
2020-06-07

共1个答案

一尘不染

如果要在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);
}
2020-06-07