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

aus*_*ton 9 c linux semaphore init

手册页中,即使您将信号量初始化为值1,也会显示:

sem_init(&mySem, 0, 1);
Run Code Online (Sandbox Code Playgroud)

多次调用时,它仍然可以增加到大于1的值

sem_post(&mySem);
Run Code Online (Sandbox Code Playgroud)

但在这个代码示例中,注释似乎有不同的看法:

sem_init(&mutex, 0, 1);      /* initialize mutex to 1 - binary semaphore */
Run Code Online (Sandbox Code Playgroud)

是否可以在C中初始化严格的二进制信号量?

注意:在这种情况下执行此操作而不是使用互斥锁的原因是sem_post和sem_wait可能由不同的线程调用.

Die*_*Epp 9

如果你想在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);
}
Run Code Online (Sandbox Code Playgroud)

  • @BillDeRose:条件变量受到虚假唤醒和被唤醒的唤醒.如果你想检查条件,你必须**在循环中使用它们. (2认同)