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