Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java P&;V工作并设置信号量值?_Java_Semaphore - Fatal编程技术网

Java P&;V工作并设置信号量值?

Java P&;V工作并设置信号量值?,java,semaphore,Java,Semaphore,我对p&V操作在信号量中的工作方式感到困惑(特别是在Java中,如果存在差异的话) 据我所知,如果新值是,则操作p将信号量的值递减。从N个数字递减值的想法是使多达N个调用不阻塞 当该值达到0时,下一次调用将被阻止,并且该值不会递减,它将保持为0 释放后,值将增加到1,等待进程将收到信号,试图获取释放的锁。只有一个能做到,其余的仍将被封锁 当所有进程释放其信号量时,该值将返回到N。从N个数字中减去该值的想法是使多达N个调用不被阻塞 当该值达到0时,下一次调用将被阻止,并且该值不会递减,它将保持为0

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


据我所知,如果新值是,则操作p将信号量的值递减。从N个数字递减值的想法是使多达N个调用不阻塞

当该值达到0时,下一次调用将被阻止,并且该值不会递减,它将保持为0

释放后,值将增加到1,等待进程将收到信号,试图获取释放的锁。只有一个能做到,其余的仍将被封锁


当所有进程释放其信号量时,该值将返回到N。

从N个数字中减去该值的想法是使多达N个调用不被阻塞

当该值达到0时,下一次调用将被阻止,并且该值不会递减,它将保持为0

释放后,值将增加到1,等待进程将收到信号,试图获取释放的锁。只有一个能做到,其余的仍将被封锁


当所有进程释放其信号量时,该值将返回到N。

操作p减少信号量的值:可能,可能不。为什么不发布P()的代码?我们会知道它的作用。给方法起一个有意义的名字,尊重Java命名约定,而不是P和V@JBNizet很久以前我就已经在C中使用了信号量,试图在Java中再次使用它们,我添加了标记,因为我不知道C如何处理信号量和Java如何处理信号量之间是否有区别。P()不是一个真正的方法,它只是解释了信号量的用途。你读过信号量及其方法的javadoc吗?因为它解释了它是如何工作的。这个javadoc中有什么不清楚的地方?与其试着猜测一些假代码会做什么,不如编写真实代码并测试它。操作P会减少信号量的值:可能,可能不会。为什么不发布P()的代码?我们会知道它的作用。给方法起一个有意义的名字,尊重Java命名约定,而不是P和V@JBNizet很久以前我就已经在C中使用了信号量,试图在Java中再次使用它们,我添加了标记,因为我不知道C如何处理信号量和Java如何处理信号量之间是否有区别。P()不是一个真正的方法,它只是解释了信号量的用途。你读过信号量及其方法的javadoc吗?因为它解释了它是如何工作的。这个javadoc中有什么不清楚的地方?与其试着猜测一些伪代码会做什么,为什么不编写真实代码并测试它呢?当阻塞的调用获得许可时,它会减少信号量值吗?还是让它保持原样?例如,C在0处被阻止,A释放许可证,因此信号量设置为1,C是否将其减至0?当A释放信号量时,信号量将增加至1,C(以及任何其他等待的进程)发出信号,并尝试获得A释放的许可证。如果A获得许可证,则再次将信号量减至0并继续,其余未能获得信号量的人继续等待。我一整天都在研究P和V操作是如何工作的,根据我的发现和理解,我认为这些操作的工作方式不同,但目标相同,这取决于它们使用的系统。Java使用System V信号量,它以一种信号量不会被判决为负值的方式实现P操作,而Linux(C)使用POSIX信号量,它以一种信号量值可以为负值的方式实现P操作。这是正确的吗?当被阻止的调用获得许可时,它是否会减少信号量值?还是让它保持原样?例如,C在0处被阻止,A释放许可证,因此信号量设置为1,C是否将其减至0?当A释放信号量时,信号量将增加至1,C(以及任何其他等待的进程)发出信号,并尝试获得A释放的许可证。如果A获得许可证,则再次将信号量减至0并继续,其余未能获得信号量的人继续等待。我一整天都在研究P和V操作是如何工作的,根据我的发现和理解,我认为这些操作的工作方式不同,但目标相同,这取决于它们使用的系统。Java使用System V信号量,它以一种信号量不会被判决为负值的方式实现P操作,而Linux(C)使用POSIX信号量,它以一种信号量值可以为负值的方式实现P操作。这是正确的吗?
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);