GNU C ライブラリのソース コードをちらりと見てみると、inet_ntoa が次のように実装されていることがわかりました。
static __thread char buffer[18]
私の質問は、reentrant inet_ntoa を使用する必要があるのに、GNU C Library の作成者が malloc を使用して実装しないのはなぜですか?
ありがとう。
ヒープを使用しない理由は、標準 (POSIX) およびその他のシステムに準拠するためです。インターフェイスは、返されたバッファを解放することになっているようなものではありません。静的ストレージを想定しています。
しかし、( を使用して) スレッド ローカルとして宣言することにより__thread
、2 つのスレッドがたまたま両方で関数を呼び出していても、2 つのスレッドが互いに競合することはありません。これは、インターフェイスの破損に対する glibc の回避策です。
これが再入可能ではないこと、またはその用語の精神と一致していないことは事実です。それを呼び出す再帰関数がある場合、バッファーが呼び出し間で同じであることに依存することはできません。ただし、複数のスレッドで使用できるため、多くの場合、これで十分です。
編集:ところで、呼び出し元が提供するバッファーを使用するこの関数の新しいバージョンがあることを思い出しました。を参照してくださいinet_ntop()
。