我目前正在用C设计一个计数信号量,试图遵守与Java相同的标准级别,除了InterupptedExceptions之外,因为C std::threads不支持中断。我正在阅读Java的类文档,这时遇到了两个让我困惑的问题。
https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Semaphore.html
问题1:
关于许可证的发布,我看到了一条语句“不要求发布许可证的线程必须通过调用acquire()来获取该许可证”,在acquire的实现中。如果在设计中没有获得许可并通过同一线程发布的所有权概念,那么下面的情况会发生什么呢。
一些流氓线程只是试图运行发布,但它根本没有获得任何发布。然后会发布什么?它会默默地返回并且什么也不做吗?
问题二:
如果一个线程获取一个信号量计数并抛出一个异常,其中可能因为异常传播到该线程函数的类之外而错过了发布,会发生什么情况。在这种情况下,这是否会导致允许泄漏?
我的2美分:
一些流氓线程只是试图运行发布,但它根本没有获得任何发布。然后会发布什么?它会默默地返回并且什么也不做吗?
信号量不是锁,因此在释放它之前无需获取许可。您甚至可以初始化初始值为负的信号量。因此,您的第一个问题的答案是,如果任何线程释放许可,它将简单地将许可计数增加释放的许可数。
在这种情况下,这是否会导致泄漏?
在类似的行中,如果线程通过获取来减少许可,并且由于任何原因而失败,而没有释放它,则计数将保持不变。我不会称之为泄漏,因为有可能出现这样一种情况,即最终用户只希望使用许可证,而从未发布许可证。
一些流氓线程只是试图运行发布,但它根本没有获得任何发布。然后会发布什么?它会默默地返回并且什么也不做吗?
最好将其称为增量
而不是发布
或返回
。您甚至可以创建具有否定权限的Semaphore
:
Semaphore semaphore = new Semaphore(-1);
在这种情况下,如果threadA尝试aquire()
,它将被阻塞,直到其他线程将权限增加释放()
两次。
在这种情况下,这是否会导致泄漏?
这就是为什么建议在资源有限时将信号量与try catch finally块一起使用的原因:
semaphore.aquire();
try {
} catch () {
} finally {
semaphore.release();
}
很多Java语言处理器不会读Java,而是读Java类文件,并从类文件生成符号表和抽象语法树。Java类文件里的代码在语法和语义上都是正确的。结果就是这些工具的作者避免考虑实现一个Java前端时会遇到的很多困难的问题。 Java编程语言的设计者在设计这个语言时没有考虑实现的简单性。确实应当如此,因为更重要的是语言容易使用。设计Java编译器前端的语义分析时遇到的一个很困难的问题就是符号表的设计。这
本文向大家介绍Java 信号量Semaphore的实现,包括了Java 信号量Semaphore的实现的使用技巧和注意事项,需要的朋友参考一下 近日于LeetCode看题遇1114 按序打印,获悉一解法使用了Semaphore,顺势研究,记心得于此。 此解视Semaphore为锁,以保证同一时刻单线程的顺序执行。在此原题上,我作出如下更改。 10个线程的常量池中,分别调用R1,R2,R3的方法多次
问题内容: 我已经使用timer_create()API实现了POSIX计时器,当计时器到期时,我将为其放置处理程序代码,这将生成SIGUSR1。现在的问题是,如果此程序收到另一个SIGUSR1,则将调用并捕获相同的信号处理程序。 有什么方法可以防止这种情况,以便处理程序可以捕获仅由计时器生成的信号? 问题答案: 这对您有用吗?(修改了手册页中示例中的代码。) 当捕捉到来自定时器的信号时,将显示。
在GATE计算信号量时会问到这些问题。 一般来说,问题非常简单,只包含减法和加法。 以下类型的问题可以在GATE中询问。 计数信号量初始化为12。然后在这个信号量上计算10P(等待)和4V(信号)操作。 结果是什么? 因此,计数信号量的最终值是。
有一些情况需要同时在临界区执行多个进程。 但是,当我们需要同时在临界区中有多个进程时,可以使用计数信号量。 信号量实现的编程代码如下所示,其中包括信号量的结构以及在临界区中可以执行的入口和退出的逻辑。 在这种机制中,临界区的入口和退出是根据计数信号量的值执行的。在任何时间点计算信号量的值表示可以同时在临界区输入的最大进程数。 想要进入临界区的进程首先将信号量值减1,然后检查它是否为负值。如果它变为
我没有使用足够奇怪的信号灯 无论如何,我在查看一些使用它的代码时发现,与锁不同,许可证可以由另一个线程发布(即没有所有权) 我研究了并发操作,它说(第98页): 实现没有实际的许可对象。。。。因此,一个线程获得的许可证可以由另一个线程发布 我之前没有注意到这个细节,并查看了一本操作系统教科书,上面写着(我的重点): 当一个进程修改信号量值时,没有其他进程。。。。等 那么这是Java具体的设计决定吗