- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这是 IBM 认为可重入的一段代码:
/* reentrant function (a better solution) */
char *strtoupper_r(char *in_str, char *out_str)
{
int index;
for (index = 0; in_str[index]; index++)
out_str[index] = toupper(in_str[index]);
out_str[index] = 0
return out_str;
}
对我来说这段代码是不可重入的,因为循环计数器的索引是在本地定义的。如果操作系统在循环内中断此线程,而另一个线程调用此函数,则索引将丢失。我错过了什么?为什么这段代码被认为是可重入的?
操作系统是否会在中断线程时将局部变量(如索引)的拷贝保存到线程的堆栈中,然后在处理继续时重新建立变量?
似乎使这个函数可重入索引必须是接口(interface)的一部分,作为调用者提供的存储。
最佳答案
not reentrant because index for the loop counter is being defined locally. Should the OS interrupt this thread inside the loop, and another thread call this function, index would be lost. What am I missing? Why is this code considered reentrant?
当中断发生时,CPU 本身将至少保存当前指令指针(可能是标志寄存器和一些段和堆栈寄存器,但它取决于 CPU),然后例如(对于 x86)根据特定内存地址处的函数指针表调用代码。可以预期这些中断处理程序会保存(例如压入堆栈)他们想要使用的其他寄存器,然后在返回之前恢复它们。
每个线程都有自己的栈,所以这一切都卡在一起。
Does the OS save a copy of local variables like index on to a thread's stack when it interrupts the thread and then reestablishes the variables when processing continues?
通常...要么保存到堆栈,要么某些 CPU(例如 Sparcs)有寄存器窗口 - 相同的 CPU 操作码在中断处理程序运行时寻址不同的寄存器,然后上下文切换回程序正在使用的寄存器。
使用非堆栈数据会阻止函数重入,例如函数体内的静态变量或某些全局变量/缓冲区。
关于c++ - 为什么这段代码被认为是可重入的?当操作系统中断线程时究竟发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22854872/
嗨,我已经阅读了 Java 中的 ReadWriteLock,但我不确定我是否掌握了它的重入部分。这是两个仅使用一个主线程来显示重入的简短代码示例 public class Locks { p
我在使用 NotifyIcons 时发现了一个重入问题。重现它真的很容易,只需在表单上放置一个 NotiftIcon,点击事件应该如下所示: private bool reentrancyDetect
我正在尝试使用 SQLite 的新 C 接口(interface)预更新 Hook : https://www.sqlite.org/c3ref/preupdate_count.html 现在回答我的
来自阅读here我发现 Actor 是可重入的,并且我希望以下情况成立:如果我有单一类型的转换 ThespianType 但有三个特定的 Actor ThespianType (T1、T2 和 T3)
有人可以向我解释一下 BlockReentrancy 的目的是什么吗?方法在ObservableCollection ? MSDN显示以下内容作为示例: //The typical usage is
我是一名优秀的程序员,十分优秀!