relibc: гонка при завершении потока, паника в posix_exit и падение в detached-потоке

06.07.2026

В relibc исправлены три ошибки в завершении потоков: гонка между выходом потока и pthread_join, паника в posix_exit при EAGAIN и падение при выходе из отсоединённого потока. Все три проявлялись как аварийное завершение процесса.

Гонка между выходом потока и pthread_join

Когда поток завершается сам, а главный поток в это время вызывает pthread_join, обе стороны меняют одно и то же состояние. Исправление исключает взаимное ожидание, из-за которого программа могла зависнуть или получить повреждённые данные.

Паника в posix_exit из-за EAGAIN

В posix_exit добавлена обработка кода EAGAIN. Раньше этот код приводил к панике: выход процесса превращался в аварийное завершение с сообщением об ошибке вместо штатного — то есть в корневой оболочке, в оконном менеджере или в программе, которая сама вызывает выход.

Падение при выходе из отсоединённого потока

Отсоединённый поток не ждёт своего завершения никем — он освобождает ресурсы сам. Здесь это приводило к падению. Правка довела обработку выхода до конца: поток теперь корректно освобождает то, что считал своим, даже если никто не вызвал pthread_join.

Почему это важно разработчику на Rust

Потоки в Rust — обычные std::thread, а присоединение использует JoinHandle поверх pthread_join. Отсоединённые потоки появляются и в самом Rust, и в крейтах вроде rayon и пулов исполнения асинхронных задач. Три эти ошибки могли ронять программу в самый неподходящий момент — при выходе, а не в середине вычислений, — и диагностировать их по месту было трудно.

Оригинал

Коммиты в репозитории redox-os/relibc от 4–6 июля 2026 года: Fix crash at posix_exit due to EAGAIN, Fix crash when exiting from detached thread, Fix exit_current_thread racing with pthread_join

Упоминаний: 1 · Просмотров: 2