在man page似乎即使您将信号量初始化为值 1:
sem_init(&mySem, 0, 1);
它仍然可以通过多次调用增加到大于 1 的值
sem_post(&mySem);
但是在这个code example评论似乎有不同的想法:
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;
bool v;
};
void mysem_post(struct binary_semaphore *p)
{
pthread_mutex_lock(&p->mutex);
if (p->v)
abort(); // error
p->v = true;
pthread_cond_signal(&p->cvar);
pthread_mutex_unlock(&p->mutex);
}
void mysem_wait(struct binary_semaphore *p)
{
pthread_mutex_lock(&p->mutex);
while (!p->v)
pthread_cond_wait(&p->cvar, &p->mutex);
p->v = false;
pthread_mutex_unlock(&p->mutex);
}
关于c - 如何在 C 中初始化二进制信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7478684/