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

在手册页中,即使您将信号量初始化为一个值,

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

Solutions Collecting From Web of "如何在C中初始化二进制信号量"

如果你想在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); }