Sto cercando di costruire una mappa nella memoria condivisa del seguente tipoMappa di <int, void*> nella memoria condivisa utilizzando boost :: interprocess
ho creare la regione di memoria condivisa in questo modo:
managed_shared_memory segment(create_only ,"MyMap" ,size);
ShMemAllocator_t alloc_inst (segment.get_segment_manager());
map = segment.construct<MyMap_t>("MyMap")
(std::less<int>()
,alloc_inst);
Il valori nella mappa sono i seguenti:
typedef pair<MutexType, boost::interprocess::offset_ptr<void> > ValueType ;
MutexType è di per sé una struttura contenente una lettura e un mutex scrittura (usando read_lock e write_lock); definiti come segue:
typedef struct mutex_struct{
sharable_lock<interprocess_mutex> read_lock(interprocess_mutex, defer_lock);
scoped_lock<interprocess_mutex> write_lock(interprocess_mutex, defer_lock);
} MutexType;
"dimensione" è la dimensione totale della mappa (in termini di oggetti, quindi la somma delle dimensioni dei dati indicate da tutti i puntatori void).
Come posso garantire che anche questi dati nulli * si trovino in questo segmento di memoria che ho creato, come posso istanziarlo all'interno dell'area di memoria condivisa esistente). La ragione per fare questo è che voglio allocare questo grande buffer una volta sola, ma rimuovendo/aggiungendo ripetutamente degli oggetti (la mappa modella una cache) Devo ancora trovare un modo in cui più oggetti possono essere allocati all'interno dello stesso segmento di memoria all'interno di una mappa. Inoltre, il tentativo di allocare la coppia MutexType restituisce un errore di compilazione che indica che non viene fornito alcun operatore di "chiamata".
(so che questo è un po 'vecchio ma) ho notato che il blocco del writer non funziona davvero nel tuo esempio.Se si generano più writer child il valore di i potrebbe essere indefinito e si proverebbe a inserire una coppia utilizzando lo stesso valore, a causa di problemi di concorrenza - Se quell'esempio dovrebbe mostrare solo l'aggiunta di un'altra voce dopo l'ultima chiave - che il metodo put deve raccogliere la dimensione corrente della mappa e inserisci l'elemento alla dimensione + 1. – Steve
Ciao @Steve, non sono sicuro di seguirlo. Perché il valore di "i" non è definito? –
Nel ciclo for - si conta ++ i fino a quando non viene restituito alcun valore da d.try_get - supponiamo che i sia ora 10. In seguito, si tenta di inserire la chiave i = 10 con d.put (i, v = std :: make_pair (MutexType(), p)) ;. Se nel frattempo un altro processo di scrittura di un bambino ha già inserito qualcosa nella mappa, 10 sarebbe un duplicato. Prendi solo 2 autori di testi - ognuno dei quali esegue una riga alla volta - entrambi arrivano a i = 10, ma child1 inserisce prima una nuova voce con i = 10, quindi il secondo figlio fallirà. Questo perché i = 10 è al di fuori di qualsiasi blocco di scrittura/lettura – Steve