浏览GNU C Library的源代码,我发现inet_ntoa是用
实现的static __thread char buffer[18]
我的问题是,由于需要使用reeentrant inet_ntoa,为什么GNU C Library的作者不使用malloc来实现它?
感谢。
答案 0 :(得分:17)
它不使用堆的原因是符合标准(POSIX)和其他系统。接口不是这样你应该释放返回的缓冲区。它假设静态存储..
但是通过将其声明为本地线程(使用__thread
),如果两个线程碰巧都在调用该函数,则它们不会相互冲突。这是glibc对于界面破碎的解决方法。
确实,这不是 re-entrant 或与该术语的精神一致。如果你有一个调用它的递归函数,你不能依赖于调用之间的缓冲区。但它可以被多个线程使用,这通常是足够好的。
编辑:顺便说一下,我记得,这个函数的新版本使用了调用者提供的缓冲区。请参阅inet_ntop()
。