попробую сформулировать проблему:
есть приложение-сервер (с клиентом никаких проблем нет).
сервер в зависимости от режима работы (обычное приложение или NT сервис) запускает нужную dll в нужном режиме.
так вот реализация работы с сокетами (TCP соединение с клиентами) в сервере находится в dll.
в dll имеется класс с конструктором и деструктором, понятное дело, в которых вызываются WSAStartup и WSACleanup соответственно.
в этой же dll имеется еще один класс работы с другим сокетом (UDP соединение с внешней железякой — коммутационная станция КСМ-400 через Ethernet).
там такой же почти конструктор и деструктор с теми же WSAStartup и WSACleanup (это для того чтоб можно этот класс в других приложениях применять).
ну и вобщем все это работает и взаимодействует между собой. Работает все прекрасно.
Проблема заключается в том, что при закрытии сервера (при вызове деструкторов, и надо сказать что выше описанные классы являются базовыми для некоего потомка через множественное наследование, то есть деструкторы вызываются один за другим сразу) происходит удачное выполнение первого вызова WSACleanup и блокируется второй вызов WSACleanup.
При этом первые два вызова WSAStartup из конструкторов проходят очень спокойно (нормально).
Вобщем схема такая :
1. WSAStartup
2. WSAStartup
3. создаются сокеты
4. какая то работа в потоках с сокетами
5. закрываются сокеты
6. WSACleanup
7. WSACleanup
из-за этого трабла в среднем на четвертое-пятое закрывание приложения происходит deadlock потока (там где деструкторы).
то есть иногда все нормально закрывается, а иногда просто заговор какой-то. В WSACleanup входит и замирает.
В чем может крыться проблема ???
VC++6.0 SP5 (NOT MFC,ATL or other libs) only Win32API
Windows2000 Pro SP4 eng (WS2_32.DLL)