POSIX 信号量上限

POSIX semaphore upper limit

我正在考虑将信号量用作经典计数器。它的起始值为 5,可以下降到 0,但不能超过 5。

sem_t sem;
sem_init(&sem, 0, 5);

// ...

sem_wait(&sem); // goes down to 4

//...

sem_post(&sem); // goes up to 5
sem_post(&sem); // goes up to 6 ?! 

我查看了文档,但没有看到任何类似 sem_post 的函数可以做到这一点。现在,我知道这种行为可以用 mutex 和 int 来实现,但是如果类似的事情可以用这种方式完成(代码少一点),我有点感兴趣。

信号量阻塞 waiter/decrementer(消费者)而不是 poster/incrementer。这意味着没有机制可以防止增量超过 5 的发生。因此,如果你想同时阻止 waiter/consumer 和 poster/incrementer(以防止超过 5),你将需要使用互斥锁和条件变量的组合。没有别的办法了。