Ver Mensaje Individual
  #3  
Antiguo 13-03-2008
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Reputación: 18
rolandoj Va por buen camino
Smile Muchas gracias. Interpretación y preguntas

Hola,

Muchas gracias por la explicación.

Si entiendo bien el argumento, en mis palabra la situación sería la siguiente:

Escenario 1:

Cuando un DLL con variables globales se carga en memoria, por parte de una aplicación, se crea con su propia memoria compartida, y esta pertenece al hilo principal. Si la aplicación que la invocó no la descarga de memoria, cuando esa misma aplicación vuelve a llamar una función de esta librería, las variables globales siguen estando disponibles ya que la memoria en que están es apropiada por la instancia de esa aplicación.

Escenario 2

Si otra aplicación, o incluso la misma, llama a la librería cuando aún está bajo el control de la primera instancia, se crea un nuevo bloque de memoria para el hilo principal de una segunda donde residirá un nuevo juego de variables globales pertenecientes a la instancia que está siendo creada. Eso significa que ambas instancias tienen juegos de memoria diferentes; por tanto si hay un recurso compartido que debiera ser único a todo el sistema y se intenta controlarlo mediante una variable global definida dentro la librería, hay un problema porque no habría una variable "global", sino dos, una en cada instancia.

En términos prácticos, el control de los dos escenarios sería así:

Si en un DLL necesito proteger datos que son globales únicamente respecto a la instancia de mi programa, puedo usar TCriticalSection , y de hecho, debería, ya que es más rápido. Es decir, en el "Escenario 1", debo usar TCriticalSection

Por otra parte, si la sección de código que necesito proteger implica acceder a recursos que están fuera de la memoria de la instancia de mi programa, entonces no puedo usar TCriticalSection, sino que debo usar Mutex. En pocas palabras, el "Escenario 2"

La lógica planteada aplica tanto a variables en memoria que sean globales al sistema operativo, como a recursos en disco, u otros dispositivos físicos compartidos entre instancias. Sin embargo, hay una serie de recursos para los que el sistema operativo, o sus propios drivers, se ocupan de estos problemas. Por ejemplo, el caso de la impresión

En consecuencia, la pregunta interesante es : Cuales recursos, específicamente, deben ser protegidos así ?

En mi caso particular, lo que más me interesa en este momento es el manejo en Web Server Applications. Según entiendo, los servidores como IIS, Apache, etc, crean una sola instancia del DLL ISAPI respectivo, y los requerimiento que reciben se los pasan a dicha instancia que es la que crea diferentes hilos. Si estoy en lo correcto, dado que no tengo ningún otro mecanismo que invoque al DLL, las porciones compartidas, que no involucren nada externo, pueden manejarse vía Secciones Criticas. Podrías confirmarlo ?
Responder Con Cita