2 votes

Comment passer des paramètres à manage_shared_memory.construct() dans Boost.Interprocess

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 :

  1. Qui reçoit réellement les paramètres par1, par2 de segment.construct le constructeur de l'objet, par exemple vector ? Si j'ai bien compris, c'est le paramètre de l'allocateur de modèle qui est transmis. Est-ce exact ?
  2. 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.

3voto

recipriversexclusion Points 1195

J'ai posé la même question sur la liste de diffusion des utilisateurs de boost et Steven Watanabe a répondu par l'affirmative. a répondu que le problème était simple : std::vector n'a pas de constructeur du type (size, allocator). En regardant sa documentation, je vois que le constructeur est

vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );

L'appel correct devrait donc être

MyVector *myvector = segment.construct<MyVector>("MyVector")(100, 0, alloc_inst);

Élémentaire, mon cher Watson, élémentaire !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X