Запуск новых потоков после вызова в C ++ зависает - PullRequest
0 голосов
/ 26 марта 2019

У меня есть приложение для Android, написанное на C # с использованием Xamarin. При этом используется библиотека C ++, обернутая SWIG (https://github.com/OpenVPN/openvpn3, если это имеет значение). Я могу использовать потоки нормально, но после определенного вызова в коде C ++ все потоки кажутся зависшими. В конце концов я получаю уведомление о том, что мое приложение зависло, поскольку поток пользовательского интерфейса перестал отвечать.

В рассматриваемом коде используется класс C #, который подклассирует класс C ++ (посредством оболочки SWIG). Я могу назвать другой код C ++ в этой библиотеке просто отлично. Например, моя установка включает в себя вызов статического метода для инициализации библиотеки, создание экземпляра моего класса и вызов метода для этого класса, чтобы получить некоторые настройки. Когда я вызываю connect в классе C # (который в конечном итоге вызывает реализацию C ++ посредством волшебства SWIG), потоки перестают нормально функционировать.

Любое использование мной темы перед вызовом connect работает нормально. После connect любая попытка запустить поток навсегда блокируется, и поток пользовательского интерфейса зависает.

Я вышел из самой библиотеки OpenVPN. Когда он доходит до внутренней точки, где, как мне кажется, он пытается запустить собственный поток для обработки пакетов UDP, я вижу остановку регистрации. Моя интерпретация заключается в том, что когда код C ++ пытается запустить новый поток, он также навсегда зависает.

Если я вручную запускаю новый поток в том же потоке, который управляет кодом OpenVPN C ++ (т. Е. В одном из его обратных вызовов после вызова connect, но до того, как он попытается создать свой новый поток), тогда запись в журнал зависает там вместо продолжения. Моя интерпретация заключается в том, что при попытке запустить мой поток зависание потока, выполняющего работу на C ++, не может продолжаться.

У меня действительно есть Android VpnService, так как он мне понадобится для работы с таблицей маршрутов и разрешениями для устройств. Я не уверен, относится ли это к этой проблеме.

...