我对信号量中的 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
并不真正存在,我只是把它放在那里来显示我想要看到/显示的内容。
最佳答案
从 N 个数字中递减该值的想法是使最多 N 个调用不被阻塞。
当该值达到0时,下一次调用将阻塞,并且该值不会递减,仍为0。
释放后,该值将增加到 1,并且等待进程将收到信号以尝试获取释放的锁。只有一个人能够做到这一点,其余的人将被阻止。
当所有进程释放信号量时,该值将恢复为N。
关于java - P & V 操作如何工作并设置信号量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46874876/