2009-12-30 18 views
9

Sto sviluppando una libreria condivisa (.so) e dll. Ho una variabile globale che viene aggiornata in più thread. Quindi ho il blocco mutex per la sincronizzazione.È una variabile globale in una libreria condivisa/dll, condivisa attraverso il processo

Non sono sicuro se i dati globali nella libreria condivisa siano condivisi tra i processi. Se è quindi ho bisogno di usare i semafori per la sincronizzazione. Comprendo che le variabili globali fanno parte del segmento di dati, quindi volevo capire come dll gestisce i dati globali tra i processi. Qualsiasi informazione w.r.t. il formato e il segmento di dll saranno utili.

Grazie.

+0

Domanda correlata con una buona spiegazione su come funzionano realmente le DLL: http://stackoverflow.com/questions/12229396/unresolved-external-symbol-static-variable-variable-used-by-method -defined-in-h –

risposta

10

Per impostazione predefinita, no, le variabili globali non vengono condivise tra i processi.

Tuttavia, è possibile utilizzare un segmento di dati (data_seg) per condividere le variabili globali tra i processi. È possibile trovare ulteriori informazioni su MSDN nell'articolo dal titolo "How do I share data in my DLL with an application or with other DLLs?"

+0

@CasperOne: Per impostazione predefinita il segmento di dati della libreria condivisa viene duplicato in ogni processo? – Andy

+0

@Andy: Non so cosa intendi per duplicato. Fondamentalmente, sarai in grado di condividere i valori tra i processi se si collega alla stessa dll, se è quello che si sta chiedendo, altrimenti si potrebbe elaborare? – casperOne

+0

@CasperOne: Penso che il segmento di codice (testo) di dll sia condiviso attraverso il processo. Quindi volevo sapere cosa succede al segmento dati della DLL. Se il contenuto del segmento dati da dll viene copiato nel segmento dei dati di processo. E come questo accade durante il caricamento dinamico di dll. – Andy

0

Assolutamente NO. Ogni processo ha il proprio spazio di memoria virtuale e non vede la memoria di altri processi. Due processi possono persino memorizzare diversi valori allo stesso indirizzo, ad esempio 1000000, perché i loro indirizzi virtuali "1000000" vengono mappati su celle di memoria fisiche diverse (ad esempio "2000000" per il primo processo e "3000000" per secondo. Shared dll non cambia nulla in questo

+0

Scusa, ma semplicemente non è vero. – casperOne

+0

Prova a leggere qualcosa, ad esempio a partire da questo: http://msdn.microsoft.com/en-us/library/ms810627.aspx sulla gestione della memoria/mappatura della memoria virtuale e gestione della memoria in diversi processi su piattaforma win32, prima di scrivere qualsiasi cosa qui :) – user224564

+0

Ironico come si dice "prova a leggere qualcosa", quando in realtà ho pubblicato un link a MSDN che mostra esattamente cosa è stato fatto, e anche perché la tua risposta è sbagliata. – casperOne

Problemi correlati