Юридические новости

Почему pthread_cancel в libcurl стал историей: причины, последствия и альтернативы

Юридические новости
RIP pthread_cancel

Подробный разбор причин отказа от использования pthread_cancel в libcurl, технические сложности с getaddrinfo(), проблемы с утечками памяти и возможные альтернативы для эффективного DNS-резолвинга в приложениях. .

В мире разработки сетевых приложений стабильность и производительность имеют первостепенное значение. Одним из ключевых элементов в этой сфере является корректное и эффективное разрешение DNS-имен. Библиотека libcurl, часто используемая для реализации сетевых клиентов, долгое время сталкивалась с проблемой блокирующего вызова getaddrinfo(), который мог затормозить работу всей программы при долгой работе с именами хоста. В попытке решить эту проблему разработчики libcurl внедрили использование функции pthread_cancel, чтобы прерывать вызывающие getaddrinfo потоки, однако эта идея столкнулась с серьезными техническими препятствиями, и совсем недавно была выведена из кода. В данной статье мы подробно рассмотрим причины, побудившие к отказу от pthread_cancel, чем вооружились разработчики взамен и какие перспективы открываются для будущего DNS-резолвинга в подобных библиотеках.

Изначально проблема заключалась в том, что getaddrinfo() - стандартная POSIX-функция для разрешения DNS-имен - является блокирующей и не предоставляет встроенных механизмов прерывания. Это значит, что если DNS-сервер долго не отвечает или настроены нестабильные сети, вызов getaddrinfo() может "зависнуть" на длительное время, что сильно ухудшало отзывчивость приложений, использующих libcurl. Чтобы обойти это ограничение, разработчики решили запускать getaddrinfo() в отдельном pthread - отдельном потоке POSIX - что позволяло остальному коду libcurl продолжать работу, не блокируясь в ожидании ответа DNS. Однако такой подход породил собственные сложности. После запуска потока с getaddrinfo необходимо было корректно его завершить.

Использование pthread_join для ожидания завершения потока было бы блокирующим, возвращая исходную проблему, а pthread_detach, наоборот, мог привести к бесконтрольному росту фоновых потоков, что негативно сказывалось на потреблении ресурсов. Чтобы решить эту дилемму, был внедрен вызов pthread_cancel, призванный прервать работу потока с getaddrinfo, освободив ресурсы немедленно и без блокировок. Теоретически идея выглядела элегантной: поток запущен, если нужно прервать - вызываем pthread_cancel и не ждем его завершения. Но, к сожалению, реальность оказалась куда сложнее. Появились жалобы пользователей и баг-репорты, в которых указывалось на утечки памяти при отмене потоков, особенно при большом количестве запросов.

 

Детальное исследование исходников glibc выявило причину - механизм getaddrinfo в glibc читает файл /etc/gai.conf для сортировки возвращаемых адресов. При этом чтение этого файла происходит через fopen, который является точкой отмены (cancellation point) для pthread_cancel. Если поток прерывается по пути чтения /etc/gai.conf, то выделенные для ответов getaddrinfo ресурсы не освобождаются, и возникает утечка памяти.

 

Учитывая что libcurl может выполнять очень много вызовов разрешения имен, накопление утечек становится реальной и серьезной проблемой. Судя по всему, glibc не предусмотрела полноценной защиты от подобных сценариев отмены потоков в getaddrinfo, что значительно ограничивает возможности безопасного использования pthread_cancel для прерывания вызовов DNS-резолвинга на базе glibc. После тщательного анализа ситуации команда libcurl приняла непростое решение отказаться от использования pthread_cancel и вернуться к более консервативному подходу - либо ждать завершения потоков с помощью pthread_join, либо принимать определенные ограничения производительности и возможного блокирования. Несмотря на то что такой шаг может показаться откатом, он является осознанным выбором в пользу надежности и предотвращения накопления ошибок и утечек в долгосрочной перспективе. Для разработчиков и пользователей libcurl эта ситуация стала сигналом о необходимости альтернативных способов резолвинга DNS.

 

Одним из таких решений является использование библиотеки c-ares, которая реализует полностью неблокирующий асинхронный DNS-резолвинг без создания дополнительных потоков. c-ares обеспечивает высокую отзывчивость и не сталкивается с описанными проблемами утечек памяти при отмене запросов. Однако у c-ares есть свои ограничения: он не всегда может гарантировать такой же уровень совместимости и функционала, как системный вызов getaddrinfo. Особенно это касается сложных настроек и правил, которые управляются в /etc/gai.conf и подобными системными компонентами.

Это означает, что выбор между glibc getaddrinfo с его надежностью и c-ares с его неблокирующим подходом зависит от конкретных требований и компромиссов в проекте. История с pthread_cancel в libcurl подчеркивает сложность управления многопоточностью, отменой операций и управления ресурсами в современных программных системах. Проблемы с поддержкой отмены функций на системном уровне могут иметь далеко идущие последствия для приложений, особенно тех, что работают на высоконагруженных серверах или в условиях ограниченных ресурсов. В итоге отказ от pthread_cancel стал шагом к более устойчивому и понятному коду, пусть и с потерей некоторого удобства неблокирующего DNS-резолвинга. Разработчики получили ценный опыт и показали пример взвешенного подхода к решению сложных инженерных задач, ориентируясь на практическую пользу и надежность.

Современный мир сетевого программирования продолжает развиваться, а DNS остается одним из наиболее сложных, но важных элементов инфраструктуры. Развитие асинхронных моделей, улучшение системных библиотек и поиск новых подходов к отмене блокирующих вызовов - вот пути, которые помогут повысить производительность и стабильность приложений в будущем. Важно следить за обновлениями libcurl и смежных библиотек, так как разработчики не оставляют попыток сделать DNS-резолвинг быстрым, безопасным и эффективным в любых условиях и на любых платформах. .

Автоматическая торговля на криптовалютных биржах

Далее
WordNumbers: Counting letters of number names, alphabetized and concatenated
Воскресенье, 04 Январь 2026 Секреты подсчёта букв в названиях чисел на английском языке: алгоритмы и оптимизация

Изучение подходов к вычислению количества букв в словесных представлениях чисел от одного до миллиарда, сортированных по алфавиту и объединённых в одну строку. Анализ семикольцевой структуры, использование функционального программирования и применение концепций из информатики для решения комплексных задач.

Giant Lenses in the Sky
Воскресенье, 04 Январь 2026 Гигантские линзы в небе: революция в военной и космической технологии будущего

Исследования BAE Systems открывают перспективы создания виртуальных атмосферных линз с помощью лазеров, которые могут изменить подход к долгосрочному наблюдению, защите от лазерных атак и использоваться в гражданских и космических применениях. .

Milk (2020)
Воскресенье, 04 Январь 2026 Молочное чудо 1995 года: как индийский идол "пил молоко" и что стоит за этим феноменом

В сентябре 1995 года в Индии произошёл необычный случай - тысячи людей увидели, как идол бога Ганеша будто бы пьет молоко. Это событие вызвало огромное общественное и международное внимание, став символом тонкой грани между верой и рациональностью.

Off-Grid Boat Data with Signal K and Meshtastic
Воскресенье, 04 Январь 2026 Как обеспечить оффлайн связь и телеметрию на лодке с Signal K и Meshtastic

Инновационное решение для владельцев яхт и катеров, позволяющее организовать надежную оффлайн связь и мониторинг состояния судна без использования интернета и сотовой связи через интеграцию Signal K и Meshtastic. .

Building Infrastructure Automation Without Terraform for Fly.io
Воскресенье, 04 Январь 2026 Автоматизация инфраструктуры на Fly.io без использования Terraform: современные подходы и практические рекомендации

Как эффективно автоматизировать развёртывание инфраструктуры на платформе Fly. io без применения Terraform, используя современные инструменты и API для максимального контроля и простоты управления .

Motive for Kirk Killing Revised After ATF 'Confused by Furry Meme' – Analysis [video]
Воскресенье, 04 Январь 2026 Пересмотр мотивов убийства Кирка после заявления ATF о непонимании фурри-мема: глубокий анализ

Подробное исследование пересмотра мотивов убийства Кирка в свете заявления ATF, заявившей о путанице из-за фурри-мема. Анализ влияния мемов на восприятие преступлений и роль общественных реакций в современных расследованиях.

Show HN: Writing – How to make a computer browser internet automatically
Воскресенье, 04 Январь 2026 Как сделать, чтобы компьютер автоматически просматривал интернет: технологии будущего сегодня

Изучите концепцию автоматического интернет-серфинга компьютера, которая объединяет искусственный интеллект, оптимизацию энергии и продвинутые алгоритмы самообучения для эффективного использования цифровых ресурсов. .