Тупик в malloc_atfork - PullRequest
       9

Тупик в malloc_atfork

0 голосов
/ 09 мая 2018

Наш многопоточный процесс заблокирован в нескольких потоках, каждый из которых показывает 3 кадра ниже в верхней части стека. GDB показывает, что другой поток застрял в fork (вызывается через popen), и, вероятно, именно поэтому malloc_atfork вместо malloc вызывается для выделения памяти.

#0  0x00007f4f02c4aeec in __lll_lock_wait_private () from 
/usr/lib64/libc.so.6
#1  0x00007f4f02bc807c in _L_lock_14817 () from /usr/lib64/libc.so.6
#2  0x00007f4f02bc51df in malloc_atfork () from /usr/lib64/libc.so.6

Существует ошибка RedHat (https://bugzilla.redhat.com/show_bug.cgi?id=906468) о взаимоблокировке в glibc между fork и malloc и других отчетах о взаимоблокировках в malloc_atfork.

И эта ссылка https://sourceware.org/ml/libc-alpha/2016-02/msg00269.html, от февраля 2016 г. содержит патч для удаления malloc_atfork.

Кто-нибудь знает решение этой проблемы?

1 Ответ

0 голосов
/ 09 мая 2018

Хотя это ошибка в glibc, это не должно произойти, кроме случаев, когда вы вызываете fork из контекста асинхронного сигнала, где он прервал код, который уже содержит блокировку malloc, и прерванный код не может двигаться вперед В противном случае это другой поток, удерживающий блокировку, и этот поток должен в конечном итоге выполнить продвижение вперед и позволить fork продолжить.

Возможно, вы звоните popen из обработчика сигнала? Если это так, это недопустимое использование, и вы должны ожидать, что оно может дать сбой многими другими способами, а не только этим.

...