一尘不染

信号量如何工作?

java

信号量可以小于0吗?我的意思是说我有一个N = 3的信号量,并且我叫“ down” 4次,那么N将保持为0,但是一个进程将被阻塞吗?

同样,如果一开始我打电话给我,N是否可以高于3?因为如我所见,如果N可以大于3,如果一开始我调用了两次,那么以后我可以调用的次数比我可以调用的次数多,因此在关键部分放置了更多的进程,则信号量使我可以。

如果有人为我澄清一下,我将不胜感激。

格雷格


阅读 230

收藏
2020-12-03

共1个答案

一尘不染

调为0时不起作用。3点时可以通话。(我在想Java)。

我再添加一些。许多人认为锁是(二进制)信号量(即-N =
1,因此信号量的值为0(保持)或1(不保持))。但这不是很正确。锁具有“所有权”的概念,因此它可能是“可重入的”。这意味着持有一个锁的线程被允许再次调用lock()(有效地将计数从0移到-1),因为该线程已经持有该锁并被允许“重新输入”。锁也可以是不可重入的。锁持有者应调用与lock()相同次数的unlock()。

信号量没有所有权的概念,因此尽管可以获取尽可能多的许可,但它们不能重入。这意味着线程在遇到值0时需要阻塞,直到有人增加信号量为止。

另外,在我所看到的(Java)中,您可以将信号量增加到大于N,这也与所有权有关:信号量没有所有权概念,因此任何人都可以给它更多许可。与线程不同,在线程中,只要线程在不持有锁的情况下调用unlock(),那都是错误。(在Java中,它将引发异常)。

希望这种思考方式有所帮助。

2020-12-03