J'ai regardé la documentation de Boost.Interprocess pendant des heures mais je n'ai toujours pas réussi à résoudre ce problème. Dans la documentation, il y a un exemple de créer un vecteur en mémoire partagée comme suit :
//Define an STL compatible allocator of ints that allocates from the managed_shared_memory.
//This allocator will allow placing containers in the segment
typedef allocator<int, managed_shared_memory::segment_manager> ShmemAllocator;
//Alias a vector that uses the previous STL-like allocator so that allocates
//its values from the segment
typedef vector<int, ShmemAllocator> MyVector;
int main(int argc, char *argv[])
{
//Create a new segment with given name and size
managed_shared_memory segment(create_only, "MySharedMemory", 65536);
//Initialize shared memory STL-compatible allocator
const ShmemAllocator alloc_inst (segment.get_segment_manager());
//Construct a vector named "MyVector" in shared memory with argument alloc_inst
MyVector *myvector = segment.construct<MyVector>("MyVector")(alloc_inst);
Maintenant, je comprends. Ce que je ne comprends pas, c'est comment passer un deuxième paramètre à segment.construct()
pour spécifier le nombre d'éléments. Le document interprocessus donne le prototype de construct()
comme
MyType *ptr = managed_memory_segment.construct<MyType>("Name") (par1, par2...);
mais quand j'essaie
MyVector *myvector = segment.construct<MyVector>("MyVector")(100, alloc_inst);
J'obtiens des erreurs de compilation.
Mes questions sont les suivantes :
- Qui reçoit réellement les paramètres
par1, par2
desegment.construct
le constructeur de l'objet, par exemplevector
? Si j'ai bien compris, c'est le paramètre de l'allocateur de modèle qui est transmis. Est-ce exact ? - Comment ajouter un autre paramètre, en plus de
alloc_inst
qui est requis par le constructeur de l'objet créé dans la mémoire partagée ?
Il y a très peu d'informations autres que les documents laconiques de Boost à ce sujet.