2009-12-30 14 views
9

Estoy desarrollando una biblioteca compartida (.so) y dll. Tengo una variable global que se actualiza en múltiples hilos. Así que tengo bloqueo mutex para sincronización.Es una variable global en una biblioteca/dll compartida, compartida en el proceso

No estoy seguro de si los datos globales en la biblioteca compartida se comparten entre procesos. Si es así, necesito usar semáforos para la sincronización. Como entiendo las variables globales son parte del segmento de datos, quería entender cómo dll gestiona los datos globales en todos los procesos. Cualquier información w.r.t. formato dll y segmento será útil.

Gracias.

+0

Pregunta relacionada con una buena explicación sobre cómo funcionan realmente las DLL: http://stackoverflow.com/questions/12229396/unresolved-external-symbol-static-variable-variable-used-by-method -defined-in-h –

Respuesta

10

De manera predeterminada, no, las variables globales no se comparten entre los procesos.

Sin embargo, puede utilizar un segmento de datos (data_seg) para compartir variables globales entre procesos. Puede encontrar más información en MSDN en el artículo titulado "How do I share data in my DLL with an application or with other DLLs?"

+0

@CasperOne: ¿Se duplicará el segmento compartido de datos de la biblioteca en cada proceso? – Andy

+0

@Andy: No sé qué quiere decir con duplicado. Básicamente, podrá compartir los valores en los procesos. si enlaza al mismo dll, si eso es lo que está preguntando. De lo contrario, ¿podría elaborar? – casperOne

+0

@CasperOne: Creo que el segmento de código (texto) de dll se comparte en el proceso. Así que quería saber qué pasa con el segmento de datos de la dll. Si los contenidos del segmento de datos de dll se copian en el segmento de datos de proceso. Y cómo sucede esto durante la carga dinámica de dll. – Andy

0

Absolutamente NO. Cada proceso tiene su propio espacio de memoria virtual y no ve memoria de otros procesos. Dos procesos pueden incluso almacenar diferentes valores en la misma dirección, digamos 1000000, porque sus direcciones virtuales "1000000" se asignan a diferentes celdas de memoria física (por ejemplo, a "2000000" para el primer proceso y a "3000000" para el segundo. Shared dll no cambia nada en esto.

+0

Lo siento, pero eso simplemente no es cierto. – casperOne

+0

Intente leer algo, por ejemplo, comience con esto: http://msdn.microsoft.com/en-us/library/ms810627.aspx sobre la gestión de memoria/mapeo de memoria virtual y la gestión de memoria en diferentes procesos en la plataforma win32, antes de escribir nada aquí :) – user224564

+0

Es irónico cómo dices "intenta leer algo", cuando de hecho publiqué un enlace a MSDN que muestra exactamente lo que se hace, y también por qué tu respuesta es incorrecta. – casperOne

Cuestiones relacionadas