在手册页中,即使您将信号量初始化为一个值,也可能会出现:
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可能由不同的线程调用。
如果要在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); }