gpt4 book ai didi

阐明 GNU C 库如何定义不可重入函数

转载 作者:行者123 更新时间:2023-11-30 14:32:56 33 4
gpt4 key购买 nike

取自:https://www.gnu.org/software/libc/manual/html_node/Nonreentrancy.html

For example, suppose that the signal handler uses gethostbyname. This function returns its value in a static object, reusing the same object each time. If the signal happens to arrive during a call to gethostbyname, or even after one (while the program is still using the value), it will clobber the value that the program asked for.

我不明白上面的场景是如何不可重入的。在我看来, gethostbyname 是一个(只读)getter 函数,它仅从内存中读取(而不是修改内存)。为什么 gethostbyname 是不可重入的?

最佳答案

顾名思义,可重入是指函数在另一个线程中被调用时能够再次被调用的能力。您提出的场景正是执行可重入性的地方。假设该函数有一些静态或全局变量(如gethostbyname(3)函数所做的那样),当一个函数正在写入该结构的返回缓冲区时,另一个调用可以重写它以完全破坏第一个写入。当函数的执行中实例(被中断的实例,而不是中断的实例)再次获得控制权时,它的所有数据都被中断的实例覆盖,并将其销毁。

解决中断问题的常见解决方案是在函数执行时禁用中断。这样它就不会被对其自身的新调用所中断。

如果两个线程调用同一段代码,并且所有参数和局部变量都存储在堆栈中,则每个线程都有一份自己的数据副本,因此同时调用两者没有问题,因为他们接触的数据位于不同的堆栈中。对于静态变量来说,这种情况不会发生,无论是本地作用域、编译单元作用域还是全局作用域(认为问题是在调用同一段代码时出现的,因此一个调用可以访问的任何地方,另一个调用都可以访问)还有)

静态数据,如缓冲区(查看 stdio 缓冲包)等,通常意味着例程将不可重入。

关于阐明 GNU C 库如何定义不可重入函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59608267/

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