问题标签 [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.
c - puts 是可重入的吗?
是int puts(const char*);
重入吗?我可以安全地将它放入信号处理程序吗?
windows - windows事件和windows定时器事件是否可以重入执行?
我有“更新”方法,它在事件处理程序(按钮单击)和 Windows 窗体计时器回调中执行。是否可以同时执行两个“更新”(重新进入)?也就是说,当定时器回调正在执行(调用 Update 方法)时,用户点击按钮,点击处理程序执行 Update。
或者,两个 Update 方法是完全序列化的,因为它们都在 UI 线程中执行。
或者,Update 是否可以将线程置于某种“Alertable Wait”(我对此不是很清楚),并且 Click Handler 可以作为 APC 执行?
你可以看到,我完全混淆了这个......
任何解释将不胜感激!
java - 在 Java 中使用什么策略进行分层可重入读/写锁定?
我正在寻找一种高效的系统,该系统具有一系列分层组织的读/写锁,以管理对分层组织资源的访问。如果一个子树被锁写,那么在整个子树被释放之前,应该无法获得其他锁;类似地,子树中的写锁应该防止锁定父树。
以下是我正在考虑的想法:
使用Apache Commons 事务。不幸的是,该项目自 2008 年 3 月以来一直没有更新,并已被非正式终止。一些 API 文档似乎表明即将发布的版本(1.3 或 2.0)将包含某种分层锁定,但源代码无处可寻,似乎我们无法再访问他们的 SVN 存储库。
使用一系列
ReentrantReadWriteLock
s,我将对其进行分层组织。我不是并发专家,我有点害怕自己做。初步的想法似乎表明,即使在我可以尝试锁定子树之前,我也必须在管理ReentrantReadWriteLock
s 本身的整个结构上使用外部锁——所以即使要释放锁,我也必须使用外部锁…</p>使用类 from
java.util.concurrent
和java.util.concurrent.atomic
以比使用一系列ReentrantReadWriteLock
s 更有效的方式实现我的分层锁。
我已经准备好走最后一条路了,但我很惊讶没有找到任何可以更好地解决这个问题的现有库。所以:
- 我错过了一些明显的解决方案吗?
- 还是这个问题特别难以正确解决?
wcf - WCF MessageBuffer.CreateMessage 线程安全吗?
http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.messagebuffer(v=vs.85).aspx说“任何公共静态(在 Visual Basic 中共享)成员这种类型是线程安全的。不保证任何实例成员都是线程安全的。
作为一般规则,实例成员似乎没有线程安全保证。
但是,我猜一些实例成员方法是可重入的和线程安全的,而另一些则不是。
MessageBuffer.CreateMessage 是一个实例方法。有没有人确认这个特定的方法是否是可重入的(或者调用者是否需要对方法的调用实施锁定)?
c++ - 有没有办法标记不可重入 C 库调用的使用?
我正在开发一个高度多线程的项目,并且想知道是否有办法让编译器标记对 C 库的非可重入调用的使用(例如 strtok_r 的 strtok intsead)?如果没有,是否有一个不可重入的调用列表,以便我可以定期 grep 通过我的代码库?
一个相关的问题是,是否有办法标记 3d 方库使用不可重入调用。
我假设可重入意味着线程安全,但不一定反过来。是否有充分的理由在线程项目中使用不可重入调用?
java - Java 的可重入锁和死锁
有人可以用 Java 代码(伪)示例向我解释如何Reentrant lock
相互关联吗?deadlock
multithreading - 使用不同的文件句柄时 fprintf 和 fscanf 是否可重入
我可以在同一进程中有 2 个线程同时调用 fprintf 或 fscanf 吗?
一个流由第一个线程写入并由第二个线程读取,另一个流由第一个线程读取并由第二个线程写入。因此,我没有同时写入或同时读取同一流的情况。
如果答案是否定的 - 我在 printf/scanf 系列中有可重入的替代方案吗?
这个问题遵循以下一些评论:Thread communication via printf and scanf (linux)
.net - 使整个方法线程安全的最简单方法?
似乎有很多关于多线程编程的知识要学习,而且有点吓人。
对于我目前的需求,我只想防止在另一个线程完成之前再次调用一个方法,我的问题是:
这是使方法线程安全的适当(安全)方法吗?
如果这还不够,那么实现这一目标的最简单方法是什么?
编辑:有关该场景的更多信息:
Foo 只有一个实例
Foo.DoWork() 将在 System.Timers.Timer 的 Elapsed 事件上从 ThreadPool 线程调用。
通常 Foo.DoWork() 将在下一次调用之前完成 eons,但我想编写代码以防止它运行很长时间,并在完成之前再次被调用。
(我也不够聪明,无法确定这个问题是否可以标记为与语言无关,所以我没有。开明的读者,如果适用,请随时这样做。)
multithreading - 在多线程程序中使用的 API 中的不可重入函数
我在 C++ 中使用 QT API,但我想答案可以有效地来自没有任何 QT 经验的人。
QT 在其 XML 处理类中有一个名为 setContent() 的函数,它被指定为不可重入的。调用时,setContent() 将 XML 文件读入内存,并将其作为数据结构返回。
据我了解,不可重入函数是从多个线程同时调用的不安全的函数,即使调用该函数以对不同的文件/对象进行操作也是如此。
因此,基于此,我的理解是,除非以某种方式保护这两个线程不能同时访问 setContent() 函数,否则我将无法拥有多个使用此函数打开 XML 文件的线程。
它是否正确?如果是这样,编写 API 似乎是一种非常糟糕的方式,因为这看起来根本不像是一个直观地会引发多线程问题的函数。此外,API根本不提供互斥锁。
因此,为了在我的多线程程序中使用此函数,其中多个线程将打开不同的 XML 文件,处理对 setContent() 函数的访问的最佳方法是什么?我应该在每个将访问 XML 的文件中包含的头文件中自己创建一个外部互斥锁吗?
c++ - 即使每个线程都对自己的数据进行操作,是否有任何 cpp 函数或对象(不包括从 c 继承的)不是线程安全的?
抱歉,标题很长,但我认为它很好地解释了我感兴趣的内容。例如,C 函数 strtok 在最坏的情况下不是线程安全的 :),它使用全局状态。因此,即使在不同的数据上调用它也不是线程安全的。所以我的问题是“C++减C”中的函数是否有同样的问题。同样,我对“如果您从 10 个线程写入同一个文件,这是未定义的行为”之类的东西不感兴趣。我感兴趣的是“如果您从 2 个差异线程(每个线程写入自己的文件)写入 2 个差异文件,那么这不是线程安全的。”