P&V 操作如何工作并设置信号量值?

How does operations P & V work and set the semaphore value?

我对 P 和 V 操作在信号量中的工作方式感到困惑(特别是在 Java 中,如果存在差异)。

据我所知,操作P递减信号量的值,如果新值<0则进程被阻塞,而操作V则相反。但是,操作 P 可以将信号量值递减为负值吗?如果是这样,是否意味着操作 V 必须将信号量增加到正值才能为进程提供许可?

假设我们有 4 个进程(或线程),分别称为 A、B、C 和 D。信号量 S 设置为 2。这些进程在创建时分别称为(A、B、C,然后是 D)。意思是 A 会先走,然后 B 第二...等

Semaphore S=new Semaphore(2);
S.acquire();
print(Thread.currentThread().getName() +" is in with S value=" + S.value);
S.release();
print(Thread.name +" is out S value=" + S.value);

根据我对它们工作原理的理解,我认为输出应该是这样的:

A is in with S=1

B is in with S=0

C tries to go in with S=-1 (Is this correct?)

B tries to go in with S=-2 (Is this correct?)

A is out with S=-1

C is in with S=-1

B is out with S=0

D is in with S=0

C is out with S=1

D is out with S=2

P.S:S.value 并不存在,我只是把它放在那里以展示我正在尝试的东西 see/show。

从 N 个数字递减值的想法是使最多 N 个调用不阻塞。

当该值达到0时,下一次调用将阻塞,该值不会递减,仍为0。

释放后,该值将增加到 1,等待进程将收到尝试获取已释放锁的信号。只有一个能够做到,其余的将保持阻塞。

当所有进程释放它们的信号量时,该值将return变为N。