Как остановить блокировку pthread_join (), реализованную в разделяемой библиотеке - PullRequest
0 голосов
/ 14 января 2019

Мой код вызывает функцию из сторонней библиотеки до выхода из программы. К сожалению, вызываемая функция блокирует основной поток, что вызвано pthread_join() в библиотеке .so.

Поскольку она находится внутри библиотеки, которая находится вне моего контроля, Я брожу, как ее разорвать, чтобы основной поток мог продолжить .

Прикрепление информации с помощью gdb:

0x00007ffff63cd06d in pthread_join (threadid=140737189869312, thread_return=0x0)
    at pthread_join.c:89
89          lll_wait_tid (pd->tid);
Missing separate debuginfos, use: debuginfo-install keyutils-libs-1.4-5.el6.x86_64 krb5-libs-1.10.3-65.el6.x86_64 libcom_err-1.41.12-23.el6.x86_64 libselinux-2.0.94-7.el6.x86_64 openssl-1.0.1e-57.el6.x86_64

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Если вы вызываете exit, процесс завершается без остановки других потоков.

Если у вас есть дескриптор pthread_t для ожидающего потока, возможно, вы можете вызвать pthread_cancel для него, но если приложение и библиотеки не готовы обработать отмену потока, это вызовет другие проблемы. (Отмена потока pthread_join не поможет, потому что отключение будет блокироваться в том же потоке, который ожидает pthread_join.)

В целом, вероятно, лучше выяснить , почему вызов pthread_join ожидает в вашей среде неопределенное время (то есть, почему другой поток не завершается), и исправить это.

0 голосов
/ 14 января 2019

Библиотека предназначена для того, чтобы вызывающий поток ожидал, когда что-то завершится. Поскольку вы не можете изменить дизайн библиотеки, просто вызовите библиотеку из потока, которому больше нечего делать.

Когда вы разрабатываете взаимодействие, вы можете получить любую семантику, какую захотите. Если вы хотите, чтобы вызывающий поток получал результаты в удобное для себя время позже, вы можете использовать обещание / будущее. Вы можете спроектировать вызывающий поток так, чтобы он ожидал определенное количество времени, а затем тайм-аут. В случае тайм-аута вы можете проигнорировать результат, если он вам не нужен, или вы можете придумать способ проверить и получить результат позже. Вы также можете сделать так, чтобы поток, вызывающий библиотеку, делал все, что нужно с результатом, чтобы вызывающий поток не беспокоился об этом.

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

...