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

debugging - 函数在中断中重新进入

我有将调试输出打印到 UART 的功能。如果此函数工作时发生中断,则中断的调试输出会中断先前的调试文本。所以我有这样的事情:“03:32:46 加载数据 fr03:32:46 按钮按下”。我考虑了一些解决方案。我更喜欢不禁用中断,而不是在它破坏其他调试打印功能时禁用调试输出。解决这个问题的好方法是什么?

0 投票
2 回答
1271 浏览

c - 使不可重入函数可重入

我正在使用普通的旧c。

我有一个使用静态局部变量的函数,因此是不可重入的。我想删除静态局部变量的使用并使函数可重入。

有关如何执行此操作的任何提示或设计建议?

这个问题是不是太模糊了?它是否需要有关我目前正在使用的设计的更多详细信息?还是在这种情况下可以遵循一般的设计模式?

0 投票
1 回答
453 浏览

c - 具有常量和静态局部变量的函数,使函数可重入?

我有一个带有静态和常量局部变量的函数,该函数是可重入的吗?

这是代码:

提前谢谢你:D

0 投票
2 回答
6248 浏览

c - 中断处理程序是否必须是可重入的?

我在中断处理程序中使用静态变量,使中断处理程序不可重入。

  1. 有一个不可重入的中断处理程序可以吗?
  2. 当引发硬件中断时,事件是进入某种队列并等待当前中断处理程序调用完成还是立即调用中断处理程序?

谢谢

PS。我正在使用 Linux。我使用的编程语言是 C,如果它有所作为的话。

0 投票
1 回答
2362 浏览

c++ - 制作可重入解析器时出错

我已经尝试了很多,但无法弄清楚错误是什么。关于这个的任何详细解释都将非常有帮助。

所以基本上我正在尝试编写一个可重入解析器,这些是我的文件。

Lex1.ll

yac1.yy

我的主要功能 testlex.cc

全局文件

生成文件

还有我的错误列表

我只是无法弄清楚出了什么问题。

期待详细的回复,没有链接。

我已经提到了这些链接

http://www.phpcompiler.org/articles/reentrantparser.html

http://plindenbaum.blogspot.in/2009/12/parsing-genetic-code-using-flex-and_14.html

0 投票
3 回答
1118 浏览

c - srandom_r 的段错误

我无计可施。这个微不足道的代码给了我Segfault,可能有什么问题?

现在,如果我像这样更改它,它可以工作:

我一定是个彻头彻尾的白痴,但我无法理解。请帮忙。

更新:calloc 返回一个有效的指针

但是,&qq代表指针

这就是区别,但尚不清楚为什么 srandom_r 无法执行。我尝试在 Linux 2.6.32-44-server #98-Ubuntu

0 投票
2 回答
5063 浏览

handlebars.js - Handlebars:递归树结构

我有一个任意深度的树结构,我想用 Handlebars 显示它。我没有看到任何递归的方法。如果我知道深度,我想我可以对其进行硬编码,但它可以是任意深度。

像这样的东西,但它需要在显示子部分递归。

Handlebars 有迭代集合的方法,但我看不到递归到子项中的方法

0 投票
1 回答
489 浏览

c - 使现有的 ANSI C 代码线程安全和可重入

我正在研究一个旧的遗留 ANSI C 系统,其中散布着很多全局变量。我是重构现有代码库的团队的一员,以使代码可重入和线程安全。我在这里找到了关于编写线程安全和可重入 ANSI C 代码的有用材料

根据我(诚然不完美)的理解,我提出了一个关于如何进行的建议——但我已经提出了一些需要解决的问题,并决定最好来这里找出最好的方法在实际开始编码之前进行设计。

我有三个主要问题:

  1. 我采取的方法是好的(即最好的还是更好的方法之一)?如果没有,是否有更好的推荐(即“最佳实践”)方式来做我想做的事情?

  2. 如果在一个线程中更改了线程局部变量,该更改是否会反映在其他线程中?如果答案是否定的(我怀疑是这样),那么这意味着两个线程可以使用不同的变量值运行。在我能想到的几乎所有应用程序中,这是不可接受的——那么现有的多线程应用程序如何避免这种情况呢?我的基本理解告诉我,在写入之前必须获取锁,并且当有任何线程读取时,写入线程必须阻塞。如果不是这种情况,那么我将不胜感激澄清正确的事件顺序。我也很欣赏一些伪代码,这些伪代码将展示如何使用我的示例数据结构来实现这个读/写操作。

  3. 出于显而易见的原因,我在上下文结构中编写的 getter 函数伪代码理想情况下应该返回指针(以避免在每次检索时复制潜在的巨大数据结构)。但是,根据我之前在问题中提到的 IBM 页面(提供的链接):

可重入函数不会在连续调用中保存静态数据,也不会返回指向静态数据的指针。所有数据都由函数的调用者提供。

所以(据我了解),getter 函数不能返回指向静态数据的指针(除非我弄错了)。有人可以澄清一下。此外,如果我不应该从 gettter 函数返回指针,有什么方法/技术可以用来防止/避免返回数据的副本(正如我所说,一些结构非常庞大/沉重)。

[[在旁边]]

我正在 Ubuntu 12.04 LTS 上开发,所以我对 POSIX 兼容的解决方案很感兴趣。

0 投票
1 回答
269 浏览

c - 是否可以从野牛语法动作更改弹性状态?

我正在用 C 语言构建一个 flex/bison 可重入解析器,并且我在 flex 词法分析器中大量使用状态,其中大部分是排他的。

但如果可能的话,我会很感激从野牛中间规则动作中设置词法分析器状态。是否有可能在执行期间从野牛(即在野牛规则的中间)通过其相关操作来更改词法分析器的状态?

0 投票
1 回答
865 浏览

winapi - DllMain DLL_PROCESS_DETACH 和 GetMessage 函数重入

我编写了一个全局挂钩,它使用SetWindowsHookEx挂钩WH_GETMESSAGE、WH_CALLWNDPROC 和 WH_CALLWNDPROCRET。
钩子 dll 在钩子进程中创建一个新线程,除其他外,该线程检查进程的音频状态并调用IAudioSessionManager2::GetSessionEnumerator()

现在有趣的部分是,我从钩子主机调用了UnhookWindowsHookEx()并且在我的 dll 的工作线程运行对IAudioSessionManager2::GetSessionEnumerator()的调用期间。该调用位于同一个线程的调用堆栈中,其中调用了带有 DLL_PROCESS_DETACH 的 DllMain。我认为原因是GetSessionEnumerator()在某处调用GetMessage()函数,而后者是可重入的。不幸的是,我记不清了,但我想我在调用堆栈中看到了。

但是有很多重要的事情我想知道并且仍然不清楚。所以这里有我的相关问题:

  1. 是否可以随时调用带有 DLL_PROCESS_DETACH 的 DllMain,即使是在运行当前正在卸载的 dll 中的函数的线程中?
  2. 当 DllMain DLL_PROCESS_DETACH 退出时,堆栈上的函数会发生什么?调用堆栈上的函数中的代码最终会执行吗?
  3. 如果这些功能不退出怎么办?dll什么时候卸载?
  4. DllMain DLL_PROCESS_DETACH 是否可以在 WH_GETMESSAGE、WH_CALLWNDPROC 和 WH_CALLWNDPROCRET 挂钩的回调期间被类似地调用?我知道并且已经通过实验证实,有时,虽然不是太频繁,但这些函数是可重入的,所以对这些函数的调用可以在上一次调用仍在同一个堆栈中运行的时间内注入,但我不知道是否也调用DllMain 可以以类似的方式注入。
  5. 何时可以在线程中准确调用 DllMain - 是否有一些特定的 Windows API 函数需要调用,而这又可能导致 DllMain DLL_PROCESS_DETACH 调用,或者它可能发生在任何指令中?
  6. 如果 DllMain DLL_PROCESS_DETACH 调用可以随时“注入”并且调用堆栈上的函数不再执行,那么我如何知道调用堆栈上的函数在哪里被中断?所以我可以在 DllMain 内部释放一些由函数在堆栈上分配的句柄或资源。
  7. 有什么方法可以暂时阻止/推迟对 DllMain DLL_PROCESS_DETACH 的调用?如果调用/中断发生在同一个堆栈中,锁显然没有帮助。

不幸的是,我可能无法通过实验解决这些问题,因为我已经在多台计算机上运行了几个月的挂钩(以及取消挂钩)代码,然后在取消挂钩期间发生 DllMain 的这种情况。尽管由于某种原因,它同时出现了四个不同的程序......


另外请有足够声誉的人喜欢合并标签“reentrant”和“reentrancy”吗?