У меня такая же проблема в Android 4.0.3.
Я обнаружил, что тупик произошел внизу с помощью GDB
bionic/libc/bionic/pthread-atfork.c
void __bionic_atfork_run_child()
{
...
pthread_mutex_unlock(&handler_mutex); <-- deadlock here
И использовать тот же код для тестирования в Android 4.2 нормально. Поэтому я использую Git, чтобы найти решение в бионическом.
И я получил решение и исправил эту проблему, исправив коммит 34e89c232dd5645fe3b5f9b40856d8e3e4cae57a
Вот основная причина:
Atfork использует мьютекс handler_mutex для защиты atfork_head. Родитель вызовет __bionic_atfork_run_prepare (), чтобы заблокировать handler_mutex, и потребуется, чтобы родитель и потомок разблокировали свою собственную копию handler_mutex после fork. В это время владелец hanlder_mutex устанавливается в качестве родителя. Если мы применим исправление kernel_id, то дочерний kernel_id будет установлен как дочерний tid.
handler_mutex является рекурсивной блокировкой, и pthread_mutex_unlock (& hander_mutex) завершится ошибкой, поскольку владелец мьютекса является родительским, а текущий tid (__get_thread () -> kernel_id) является дочерним, а не совпадает с владельцем мьютекса. В это время handler_mutex остается в состоянии блокировки. Если дочерний элемент хочет после этого обработать другой процесс, он попытается заблокировать handler_mutex, а затем заблокируется.