Windows сокет зависает при выгрузке библиотеки - PullRequest
0 голосов
/ 05 марта 2020

(Возможное решение в конце этого Q.)

Динамическая загрузка библиотеки с именем X (на Windows 10 , последний VS компилятор) в основном тестовом приложении.

X библиотека открывает Windows именованное соединение по каналу с помощью Boost (1.71) .

Выгрузить библиотеку:

  1. После каждого деструктора ~ io_context , после вызова ~ winsock_init .
  2. Во время уборки последний зависает в cleanup (data _); , потому что есть один выдающийся_работ_ .

Это немного сложно сценарий, но я не могу воспроизвести его по-другому.

Моя проблема похожа на это:

https://asio-users.narkive.com/RmpqKB4g/problem-with-dll-causing-program-to-hang-upon-exit-when-io-service-contains-a-handler-to-async-read

По приведенной выше ссылке есть ответ:

«Да, возможно, вы не сможете передавать сообщения между потоками во время выгрузки».

Это моя следующая попытка…

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать, что. У меня очень хорошая среда для отладки ... пожалуйста, не стесняйтесь спрашивать более подробную информацию.

(В случае не загруженной загрузки это не вызывает проблем.)

Примечания:

Почему в библиотеке load dyn столько сокетов? Winsock_init вызывался много раз, почему?

EDIT:

Изменение run () на poll () изменило сценарий, и мое тестовое приложение не зависло, но:

  • Я не знаю разницы между run () и poll (). Чтобы быть более точным c, я не уверен, что знаю обо всех побочных эффектах (я не нашел подробного сравнения).
  • Приложение вылетело при выгрузке библиотеки (FreeLibrary).

1 Ответ

0 голосов
/ 10 марта 2020

Чтение вашего комментария и других сообщений, изменяющихся с poll () на run (), решает проблему. Я думаю, что моя текущая проблема с журналом повышения: https://github.com/boostorg/log/issues/56

...