问题标签 [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 投票
2 回答
580 浏览

c - puts 是可重入的吗?

int puts(const char*);重入吗?我可以安全地将它放入信号处理程序吗?

0 投票
1 回答
126 浏览

windows - windows事件和windows定时器事件是否可以重入执行?

我有“更新”方法,它在事件处理程序(按钮单击)和 Windows 窗体计时器回调中执行。是否可以同时执行两个“更新”(重新进入)?也就是说,当定时器回调正在执行(调用 Update 方法)时,用户点击按钮,点击处理程序执行 Update。

或者,两个 Update 方法是完全序列化的,因为它们都在 UI 线程中执行。

或者,Update 是否可以将线程置于某种“Alertable Wait”(我对此不是很清楚),并且 Click Handler 可以作为 APC 执行?

你可以看到,我完全混淆了这个......

任何解释将不胜感激!

0 投票
2 回答
1721 浏览

java - 在 Java 中使用什么策略进行分层可重入读/写锁定?

我正在寻找一种高效的系统,该系统具有一系列分层组织的读/写锁,以管理对分层组织资源的访问。如果一个子树被锁写,那么在整个子树被释放之前,应该无法获得其他锁;类似地,子树中的写锁应该防止锁定父树。

以下是我正在考虑的想法:

  • 使用Apache Commons 事务。不幸的是,该项目自 2008 年 3 月以来一直没有更新,并已被非正式终止。一些 API 文档似乎表明即将发布的版本(1.3 或 2.0)将包含某种分层锁定,但源代码无处可寻,似乎我们无法再访问他们的 SVN 存储库。

  • 使用一系列ReentrantReadWriteLocks,我将对其进行分层组织。我不是并发专家,我有点害怕自己做。初步的想法似乎表明,即使在我可以尝试锁定子树之前,我也必须在管理ReentrantReadWriteLocks 本身的整个结构上使用外部锁——所以即使要释放锁,我也必须使用外部锁…</p>

  • 使用类 fromjava.util.concurrentjava.util.concurrent.atomic以比使用一系列ReentrantReadWriteLocks 更有效的方式实现我的分层锁。

我已经准备好走最后一条路了,但我很惊讶没有找到任何可以更好地解决这个问题的现有库。所以:

  • 我错过了一些明显的解决方案吗?
  • 还是这个问题特别难以正确解决?
0 投票
2 回答
453 浏览

wcf - WCF MessageBuffer.CreateMessage 线程安全吗?

http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.messagebuffer(v=vs.85).aspx“任何公共静态(在 Visual Basic 中共享)成员这种类型是线程安全的。不保证任何实例成员都是线程安全的。

作为一般规则,实例成员似乎没有线程安全保证。

但是,我猜一些实例成员方法是可重入的和线程安全的,而另一些则不是。

MessageBuffer.CreateMessage 是一个实例方法。有没有人确认这个特定的方法是否是可重入的(或者调用者是否需要对方法的调用实施锁定)?

0 投票
5 回答
1554 浏览

c++ - 有没有办法标记不可重入 C 库调用的使用?

我正在开发一个高度多线程的项目,并且想知道是否有办法让编译器标记对 C 库的非可重入调用的使用(例如 strtok_r 的 strtok intsead)?如果没有,是否有一个不可重入的调用列表,以便我可以定期 grep 通过我的代码库?

一个相关的问题是,是否有办法标记 3d 方库使用不可重入调用。

我假设可重入意味着线程安全,但不一定反过来。是否有充分的理由在线程项目中使用不可重入调用?

0 投票
4 回答
12069 浏览

java - Java 的可重入锁和死锁

有人可以用 Java 代码(伪)示例向我解释如何Reentrant lock相互关联吗?deadlock

0 投票
1 回答
1736 浏览

multithreading - 使用不同的文件句柄时 fprintf 和 fscanf 是否可重入

我可以在同一进程中有 2 个线程同时调用 fprintf 或 fscanf 吗?

一个流由第一个线程写入并由第二个线程读取,另一个流由第一个线程读取并由第二个线程写入。因此,我没有同时写入或同时读取同一流的情况。

如果答案是否定的 - 我在 printf/scanf 系列中有可重入的替代方案吗?

这个问题遵循以下一些评论:Thread communication via printf and scanf (linux)

0 投票
4 回答
6078 浏览

.net - 使整个方法线程安全的最简单方法?

似乎有很多关于多线程编程的知识要学习,而且有点吓人。

对于我目前的需求,我只想防止在另一个线程完成之前再次调用一个方法,我的问题是:

这是使方法线程安全的适当(安全)方法吗?

如果这还不够,那么实现这一目标的最简单方法是什么?


编辑:有关该场景的更多信息:

  • Foo 只有一个实例

  • Foo.DoWork() 将在 System.Timers.Timer 的 Elapsed 事件上从 ThreadPool 线程调用。

  • 通常 Foo.DoWork() 将在下一次调用之前完成 eons,但我想编写代码以防止它运行很长时间,并在完成之前再次被调用。


(我也不够聪明,无法确定这个问题是否可以标记为与语言无关,所以我没有。开明的读者,如果适用,请随时这样做。)

0 投票
2 回答
276 浏览

multithreading - 在多线程程序中使用的 API 中的不可重入函数

我在 C++ 中使用 QT API,但我想答案可以有效地来自没有任何 QT 经验的人。

QT 在其 XML 处理类中有一个名为 setContent() 的函数,它被指定为不可重入的。调用时,setContent() 将 XML 文件读入内存,并将其作为数据结构返回。

据我了解,不可重入函数是从多个线程同时调用的不安全的函数,即使调用该函数以对不同的文件/对象进行操作也是如此。

因此,基于此,我的理解是,除非以某种方式保护这两个线程不能同时访问 setContent() 函数,否则我将无法拥有多个使用此函数打开 XML 文件的线程。

它是否正确?如果是这样,编写 API 似乎是一种非常糟糕的方式,因为这看起来根本不像是一个直观地会引发多线程问题的函数。此外,API根本不提供互斥锁。

因此,为了在我的多线程程序中使用此函数,其中多个线程将打开不同的 XML 文件,处理对 setContent() 函数的访问的最佳方法是什么?我应该在每个将访问 XML 的文件中包含的头文件中自己创建一个外部互斥锁吗?

0 投票
3 回答
128 浏览

c++ - 即使每个线程都对自己的数据进行操作,是否有任何 cpp 函数或对象(不包括从 c 继承的)不是线程安全的?

抱歉,标题很长,但我认为它很好地解释了我感兴趣的内容。例如,C 函数 strtok 在最坏的情况下不是线程安全的 :),它使用全局状态。因此,即使在不同的数据上调用它也不是线程安全的。所以我的问题是“C++减C”中的函数是否有同样的问题。同样,我对“如果您从 10 个线程写入同一个文件,这是未定义的行为”之类的东西不感兴趣。我感兴趣的是“如果您从 2 个差异线程(每个线程写入自己的文件)写入 2 个差异文件,那么这不是线程安全的。”