¿Está bien registrar WSACleanup a través de la función atExit? Tenemos varias aplicaciones que pueden finalizar en diferentes puntos del código, por lo que nos gustaría evitar poner WSACleanup en todas partes a través del código. Curamente llamamos a WSAStartup/WSACleanup a través de DllMain ya que tenemos un dll que es utilizado por todas estas aplicaciones. Sin embargo, Microsoft recomienda estrictamente evitar el uso de WSAStartup/WSACleanup a través de DllMain, ya que esto puede causar interbloqueos. Podemos mover WSAStarup fuera de DllMain y llamarlo en un punto del código para todas las aplicaciones antes de que accedan a la biblioteca de sockets de Windows. Y, tan pronto como llamemos a WSAStartup, nos gustaría usar la función atExit para registrar una llamada a WSACleanup. ¿Alguien tiene alguna experiencia con este enfoque? ¡Gracias!WSACleanup y atExit
Respuesta
Si tiene una aplicación de subprocesos múltiples y algunos de los subprocesos aún están conectados, puede que las aplicaciones en el otro extremo no prefieran la forma en que termina la conexión. Por lo tanto, es preferible cerrar todas las comunicaciones de forma ordenada antes de que main() finalice, y cuando lo haya hecho, puede llamar a WSACleanup.
Bueno, creo que atExit no debe ser utilizado. Debe seguir el principio de RAII de envoltura de inicialización y destrucción de la biblioteca de socket en una clase.
Estoy de acuerdo en que el enfoque RAII es favorable.
Sin embargo, una palabra de advertencia: atExit mezclado con dlls y controladores se interrumpe en las ventanas. Desafortunadamente, esto también afecta a RAII ya que esto se implementa con manejadores de atExit en el tiempo de ejecución de C++.
El orden en que atexit manejadores se invocan en las ventanas:
- salida en algún lugar se llama o main() se sale del ámbito
- manipuladores atexit definidos en el proceso se llaman.
- todos los identificadores se destruyen.
- se llaman los controladores atexit definidos en dlls.
No importa si los manejadores de atexit en dlls están registrados antes que los manejadores en el proceso, los manejadores de proceso se llaman primero y los manejadores se destruyen antes de llamar a los controladores dll. Esto da como resultado excepciones win32, cuando se llama al código de limpieza ya que todos los identificadores propiedad de dlls ya no son válidos.
Este código de efectos tiene asas para hilos, mutex, archivos, sockets, etc. Si se asignan en un dll, entonces deben limpiarse antes de llamar a la salida o no funcionar.
Por cierto, no estoy en contra de la ventana, si estoy equivocado o alguien sabe alguna forma de evitar esto, me gustaría saber que esto me causa un dolor incalculable en la limpieza de la aplicación. Me imaginé que esto sería depurar el manejo de la salida en el tiempo de ejecución de C++, después de obtener excepciones win32 cuando las aplicaciones salgan.
Tuve que eliminar todas las llamadas para salir de mi código. Ahora me aseguré de que no hay datos estáticos en un dll controla un mango. Todos los controladores estáticos están controlados por objetos que se destruyen cuando el principal sale del alcance.
No roto. Si descargó las DLL antes de los dtors globales del EXE, cualquier dtor de la aplicación fallaría al llamar a una función desde ese dtor.La configuración actual permite que el EXE dependa de las DLL, pero no al revés. Además, no debería abrir o cerrar identificadores en DLLMain, esa no es una regla nueva. El procesamiento AtExit forma parte de DLLMain, por lo que hereda esas reglas. Una solución rápida es utilizar punteros inteligentes para todos los recursos de DLL. Cuando la aplicación limpia su último puntero inteligente a un recurso DLL, la DLL sabrá que puede limpiar, y esto es antes de AtExit. – MSalters
Gracias por la nota en DLLMain, no me di cuenta de esto. Su nota sobre el puntero inteligente: esto solo funcionará si se declara en main o below y no estático, ¿verdad? – iain
Todavía no entiendo la forma correcta de hacerlo. ¿Qué pasa si tengo una DLL que proporciona una cierta funcionalidad? Una aplicación que carga el DLL e invoca ciertas funciones (que tienen acceso interno a la API de Winsock) necesita tener WSAStartup llamado al menos una vez. Puedo ajustar todas estas funciones en una clase y asegurarme de que WSAStartup se llame al menos una vez. La aplicación ahora puede salir en cualquier punto del tiempo y la única forma que veo de llamar a WSACleanup es a) a través de atExit o b) a través de un desctructor global. Por lo que entendí, ambos pueden causar problemas. ¿Cuál es la salida de esto? –
- 1. Frasco y Web.py tanto colgar en atexit
- 2. Python Multiprocesamiento atexit Error "Error en atexit._run_exitfuncs"
- 3. Freeing en un atexit()
- 4. Python Process no llamará a atexit
- 5. ¿Puedo deshacer o eliminar un comando atexit?
- 6. atexit, delegado de salida en C#
- 7. python 2.6.x theading/signals/atexit ¿falla en algunas versiones?
- 8. ¿Qué significa "dinámico" en "destructor de atexit dinámico"?
- 9. bloqueo de C++/CLI en modo mixto: corrupción de montón en atexit (registro de destructor estático)
- 10. "DSO hace referencia al símbolo oculto 'atexit' cuando se utiliza libtool con gcov
- 11. 'no atexit módulo denominado' cuando corro un programa implementado usando PyInstaller
- 12. Obtener el estado de salida desde el interior de una función registrada con atexit()
- 13. ¿Cómo encontrar el código de salida o el motivo cuando se llama a la llamada atexit en Python?
- 14. winsock error de compilación, no puede encontrar las estructuras addrinfo y algunas funciones relacionadas
- 15. g ++, inicialización estática y -nostdlib
- 16. Liberando recursos de C++ y fork-exec?
- 17. ¿Qué significa este código: "imprimir >> sys.stderr"
- 18. ¿Qué es la función __tcf_0? (Visto al usar gprof y g ++)
- 19. Cómo vincularse con msvcr90.dll con mingw gcc?
- 20. Enviando correos electrónicos usando C
- 21. CherryPy Logging: ¿Cómo configuro y uso los registradores globales y de nivel de aplicación?
- 22. ¿Es esta la implementación de Singleton de Objective C refinada definitivamente?
- 23. Reemplazando "#", "$", "%", "&", y "_" con "\ #", "\ $", "\%", "\ &" y "\ _"
- 24. ¿Qué es y = y | =
- 25. CSS "y" y "o"
- 26. Sustituto para bifurcar en Windows
- 27. Rails y markdown y editor
- 28. dividir y conquistar y recursión
- 29. Capacidades y Linux y Java
- 30. XHTML y Y (Ampersand) codificación
Si bien el estilo, esto no ayuda ni un ápice. Desde el punto de vista del proceso, el procesamiento atexit() ocurre al mismo tiempo que la ejecución de destructores globales. Cualquier problema que tenga al llamar a WSACleanup desde AtExit, es probable que aún tenga que llamarlo desde un dtor. – MSalters