pthread_join зависает бесконечно __lll_lock_wait_private () - PullRequest
1 голос
/ 07 января 2020

У меня есть многопоточное приложение, в котором я создаю несколько потоков и выполняю pthread_join по завершении.

Основной поток порождает потоки и ожидает на pthread_join() присоединения рабочих потоков. Я сталкиваюсь с проблемой, когда главный поток ожидает бесконечно в pthread_join(), и все рабочие потоки закрылись, что привело к зависанию программы. Я определил, что все рабочие потоки вышли, проверив info thread на GDB, поскольку в нем перечислены только основные потоки. Известно, что вызов pthread_join() в вышедшем потоке вернется немедленно. Но это кажется другим. Это трассировка стека GDB.

#0  0x00007f45fefebeec in __lll_lock_wait_private () from /lib64/libc.so.6
#1  0x00007f45fef68a6f in _L_lock_5333 () from /lib64/libc.so.6
#2  0x00007f45fef62408 in _int_free () from /lib64/libc.so.6
#3  0x00007f45ffbe5088 in _dl_deallocate_tls () from /lib64/ld-linux-x86-64.so.2
#4  0x00007f45ff9bde67 in __free_stacks () from /lib64/libpthread.so.0
#5  0x00007f45ff9bdf7f in __deallocate_stack () from /lib64/libpthread.so.0
#6  0x00007f45ff9bff93 in pthread_join () from /lib64/libpthread.so.0
#7  0x00007f45f87a6fe1 in waitForWorkerThreadsToExit () at src/server.c:133
#8  ServerLoop (arg=<optimized out>) at src/server.c:662
#9  0x00007f45ff9bee25 in start_thread () from /lib64/libpthread.so.0
#10 0x00007f45fefde34d in clone () from /lib64/libc.so.6

Я на CentOS7 and Linux kernel 3.10

Может кто-нибудь помочь? ТИА

1 Ответ

0 голосов
/ 10 января 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...