gpt4 book ai didi

c++ - 为什么这段代码被认为是可重入的?当操作系统中断线程时究竟发生了什么?

转载 作者:可可西里 更新时间:2023-11-01 18:27:19 26 4
gpt4 key购买 nike

这是 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com