POSIX 信号量上限

Posted

技术标签:

【中文标题】POSIX 信号量上限【英文标题】:POSIX semaphore upper limit 【发布时间】:2018-01-19 18:08:21 【问题描述】:

我正在研究将信号量用作经典计数器。它的起始值为 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 来实现,但是如果可以用这种方式完成类似的事情(代码少一点),我有点感兴趣。

【问题讨论】:

【参考方案1】:

信号量阻止服务员/递减器(消费者)而不是发布者/递增器。这意味着没有机制可以防止发生超过 5 的增量。因此,如果您想同时阻止服务员/消费者和海报/增量器(以防止超过 5),您将需要使用互斥锁和条件变量的组合。没有其他办法。

【讨论】:

对,我并不是真的要阻止帖子,而是让sem_post 什么都不做。显然,正如您所建议的,这是不可能的。我将退回到手动操作,因为编写起来真的很简单;)谢谢!

以上是关于POSIX 信号量上限的主要内容,如果未能解决你的问题,请参考以下文章

POSIX 信号量

linux c编程:Posix信号量

linux进程间通信之Posix 信号量用法详解代码举例

Posix信号量

Linux 信号量之Posix基于内存的信号量

POSIX 信号量父信号量值不受影响