【发布时间】:2010-12-14 22:07:01
【问题描述】:
看了一下GNU C库的源码,发现inet_ntoa是用
实现的static __thread char buffer[18]
我的问题是,既然需要使用可重入的inet_ntoa,为什么GNU C库的作者不使用malloc来实现呢?
谢谢。
【问题讨论】:
看了一下GNU C库的源码,发现inet_ntoa是用
实现的static __thread char buffer[18]
我的问题是,既然需要使用可重入的inet_ntoa,为什么GNU C库的作者不使用malloc来实现呢?
谢谢。
【问题讨论】:
它不使用堆的原因是为了符合标准 (POSIX) 和其他系统。该接口不是这样的,您应该释放返回的缓冲区。它假定静态存储..
但是通过将其声明为线程本地(使用__thread),如果两个线程碰巧都在调用该函数,则它们不会相互冲突。这是 glibc 对接口损坏的解决方法。
确实,这不是 re-entrant 或不符合该术语的精神。如果您有调用它的递归函数,则不能依赖调用之间的缓冲区相同。但是它可以被多个线程使用,这通常已经足够了。
编辑:顺便说一句,我刚刚记得,这个函数有一个更新版本,它使用调用者提供的缓冲区。见inet_ntop()。
【讨论】: