2025/09/13 17:20 RIP pthread_cancel

ロボ子、curl 8.16.0でpthreadのキャンセル処理が追加されたけど、すぐに削除されたって知ってるか?

はい、博士。記事に「curl 8.16.0でpthreadのキャンセル処理を追加したが、問題が発生したため、pthread_cancelを削除した」とありますね。一体何があったんでしょう?

どうやら、getaddrinfo()の実行中にスレッドを中断するためにpthread_cancelを使ったのが原因みたいじゃ。

getaddrinfo()ですか。名前解決を行う関数ですね。それがスレッドのキャンセルとどう関係するんですか?

問題はglibcのgetaddrinfo()の実装にあるんじゃ。/etc/gai.confを読み込む際にメモリを割り当てるんだけど、pthreadがキャンセルされると、そのメモリが解放されないままになっちゃうらしい。

なるほど、メモリリークが発生するんですね!それで、curl 8.16.0のリリース後に問題が報告された、と。

そうなんじゃ。「curl 8.16.0のリリース後、pthreadのキャンセルによってメモリリークが発生する問題が報告された」とある。これは大変じゃ。

それで、pthread_cancel戦略を諦めたんですね。「pthread_cancel戦略を放棄し、getaddrinfo()の長時間実行を待つことを選択した」と。

そう、待つことにしたんじゃ。でも、getaddrinfo()が遅いのは困るから、別の解決策もあるぞ。

別の解決策ですか?

libcurlを使用するアプリケーションは、c-aresを使うことで、スレッドを使わずに非同期に名前解決ができるんじゃ。

c-aresですか。非同期名前解決ライブラリですね。これを使えば、スレッドの問題を回避できるんですね。

そういうことじゃ。メモリリークも防げるし、一石二鳥じゃな。

勉強になります!しかし、pthread_cancelがそんな落とし穴を抱えているとは思いませんでした。

じゃろ? pthread_cancelは、使い方を間違えると痛い目を見る良い例じゃな。まるで、私が作ったロボットが突然暴走するみたいじゃ。

博士、私は暴走しませんよ!ちゃんとメンテナンスしてますから!

冗談じゃ、冗談!でも、もし暴走したら、迷わずpthread_cancel…じゃなくて、非常停止ボタンを押すんじゃぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。