问题标签 [reentrancy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
3739 浏览

java - 关于多次锁定尝试,使用 java.concurrent.ReentrantLock

我注意到以下代码块:

印刷 :

这很奇怪 - 我希望连续的锁失败,因为 s 永远不会解锁。

这里有什么见解吗?

0 投票
1 回答
4801 浏览

unix - 线程安全和异步信号安全之间的区别

根据 APUE 2e 第 12.5 章:

如果一个函数对于多个线程是可重入的,我们就说它是线程安全的。然而,这并不能告诉我们函数对于信号处理程序是否是可重入的。我们说可以安全地从异步信号处理程序重新进入的函数是异步信号安全的。

我的问题是

Q1:

是否有“一般重入”概念(这意味着在所有情况下都可以重入)?如果有,一般重入是否等于仅对多线程和异步信号的重入?还是在谈论一般重入时还必须考虑第三个条件?

Q2:

线程安全并不意味着异步信号安全,这是显而易见的。但是,异步信号安全是否确实意味着线程安全?我用谷歌搜索了很多,人们说它确实如此,但我找不到任何来源。

问题 3:

如果 Q1 和 Q2 的答案都是肯定的,我猜一般重入就等于异步信号安全?

0 投票
1 回答
338 浏览

scala - Scala 编译器是可重入的吗?

对于多人编程游戏,我正在为 Scala 开发一个后台编译服务器,该服务器支持编译玩家提交的多个独立源代码树。Global通过实例化编译器对象,我成功地运行了快速的顺序编译,而无需重新加载编译器

然后通过运行单个编译作业

我现在理想地希望并行化服务器(即同时运行多个编译),但仍然不需要每次都从头开始重新加载编译器(主要是为了避免重新解析库)。这可能吗,即上面显示的第二部分(安全:-) 可重入,还是保持全局状态?如果没有,还有什么我可以尝试的吗?我目前专注于支持 Scala 2.9.1。

0 投票
1 回答
745 浏览

objective-c - Objective-C 可重入函数

我是Objective C的新手,我遇到了以下问题:

这个想法是调用 funcA 以连接到服务器,该服务器通过调用 funcB 多次附加数据,然后在发送所有数据时最后调用 funcC。还行吧。

我遇到的问题是 funcA 可以被多次调用,这导致数组在处理旧请求的过程中将被设置为长度 0。

现在我已经尝试了 funcA 中的 [NSLock lock] 和 funcC 中的 [NSLock unlock] 但是第二个请求上的 lock 调用造成了死锁。我了解同步是解决此问题的另一种方法,但我只看到函数中的块。

我通常用 C 编程,我会使用 pthread_mutex 但我想一直坚持使用 obj C。假设它们是不同的线程,但似乎它们不是(因为死锁)。

我怎么解决这个问题?

谢谢。印地

0 投票
2 回答
217 浏览

servlets - 服务器端代码中的线程安全

我是服务器端编码和 JSP/servlet 的新手。我有一个包含 3 个类的代码。第一个是从 java httpservlet 继承的 Serv 类。在这我实现了 doPost() 方法。在 doPost() 中,我使用第二类 ResourceClass 的对象。ResourceClass 是一个单例类。因此,基本上使用任何方法都是做类似 ResourceClass.getInstance().readResource(); 现在 readResource 进一步使用 Java Native 访问库从磁盘读取资源。现在我的问题是,因为据我了解,如果有 1000 个客户端针对每个新请求连接到我的服务器(Apache Tomcat),我将有一个新的 servlet 服务于该请求。但是所有这些 servlet 本质上都将使用相同的单例对象。因此,此读数将是线程安全的。

我不改变任何内部状态。所以我认为它不会影响我的输出,因此整个东西都是幂等的。但是所有这些请求是否都会排队,从而使单例类对象成为瓶颈。或者每个servlet都有自己的副本。

此外,如果我更改资源状态,那么在这种情况下它将是线程安全的。

0 投票
1 回答
174 浏览

reentrancy - 可重入代码的用途?

应该可重入的应用程序或方法类型的示例是什么?还是您通常应该努力争取的东西?

此外,在(纯)函数式编程中,您的代码通常是可重入的吗?

0 投票
2 回答
460 浏览

c++ - 如何正确使用 _vsnprintf_r()?

我正在尝试学习有关重入呼叫的知识,并且正在尝试使用_vsnprintf_r(). 第一个参数似乎是 some struct _reent *。在 Cygwin 上,似乎我可以像这样使用它:_vsnprintf_r (_REENT, /* rest of the arguments here */). 这个对吗?即使在 Cygwin 之外,这是否正确?似乎确实缺乏这方面的文档。我的 Google 和 Bing 搜索结果并不理想。

0 投票
1 回答
224 浏览

objective-c - 具有 Run-to-Completion 语义的 KVO - 有可能吗?

我最近遇到了 KVO 的重入问题。为了形象化这个问题,我想展示一个最小的例子。考虑一个AppDelegate类的接口

以及它的实现

出乎意料的是,这个程序将43打印到控制台。

原因如下:

如您所见,某些不同的类(可能在您无权访问的第三方代码中)可能会为属性注册一个不可见的观察者。每当属性的值发生变化时,这个观察者就会被同步调用。

因为调用发生在另一个函数的执行过程中,这会引入各种并发/多线程错误,尽管程序在单个线程上运行。更糟糕的是,在客户端代码中没有明确通知的情况下发生了更改(好吧,您可以预期,每当您设置属性时都会出现并发问题......)。

在 Objective-C 中解决这个问题的最佳实践是什么?

  • 是否有一些常见的解决方案可以自动恢复运行到完成的语义,这意味着 KVO-Observation 消息通过事件队列,在当前方法完成执行并恢复不变量/后置条件之后?

  • 不暴露任何属性?

  • 用布尔变量保护对象的每个关键功能以确保无法重入?例如:assert(!opInProgress); opInProgress = YES;在方法的开头,在方法opInProgress = NO;的结尾。这至少会在运行时直接揭示这些错误。

  • 或者是否有可能以某种方式退出 KVO?

更新

根据 CRD 的回答,这里是更新的代码:

BigBugSource

AppDelegate

0 投票
2 回答
478 浏览

java - 扩展类时可重入锁?

给定以下示例: 在此处输入图像描述

这个例子来自“Java Concurrency in Practice”。

有一条评论:

因为 Widget 和 LoggingWidget 中的 doSomething 方法都是同步的,所以在继续之前,它们都会尝试获取 Widget 上的锁。

为什么doSomethingLoggingWidget类中的方法需要获取锁Widget?如果是这样,in 方法的onsynchronized就没用了,对吧?doSomethingLoggingWidget

0 投票
2 回答
728 浏览

c# - Fluent Interfaces - 确保新实例

我有一个类公开了一个流利的界面样式,我也希望它是线程安全的。

目前,在类的实例上调用可链接的方法会设置各种带有操作(Func<T>'s)的集合。

当请求结果时,真正的工作就会发生。这允许用户以任何顺序链接方法调用,以便:

(这里,5 是重试失败的服务调用的次数。)

显然这不是线程安全的或可重入的。

有哪些常见的设计模式可以解决这个问题?

如果必须首先调用 Execute 方法,我每次都可以简单地返回一个新的类实例来使用,但是由于可以在链中的任何点调用任何方法,你将如何解决这个问题?

我更感兴趣的是理解解决这个问题的各种方法,而不是仅仅为了“让它正常工作”而给出一个单一的答案。

我已将完整代码放在 GitHub 上,以防有人需要更广泛的背景来了解我的目标:https ://github.com/JamieDixon/ServiceManager