2010-12-06 5 views
0

J'ai créé une mémoire partagée qui contient une liste. Je dois continuellement ajouter des nœuds dans la liste. Mon autre application lit la liste et affiche le contenu lu. Le problème que je suis confronté est le nœud a éclaté ne libère pas la mémoire ainsi pendant que la première application continue à l'insertion à un point où elle jette la faute de segmentation. Veuillez me guider comme comment libérer le noeud afin que cet espace puisse être utilisé par ma première application pour allouer un nouveau noeud.Libération de la mémoire d'un noeud dans la mémoire partagée à l'aide de la bibliothèque boost

Snippet de mon code est

#include </tcs/dev/lib/boost_1_38_0/boost/interprocess/managed_shared_memory.hpp> 
#include </tcs/dev/lib/boost_1_38_0/boost/interprocess/containers/list.hpp> 
#include </tcs/dev/lib/boost_1_38_0/boost/interprocess/allocators/allocator.hpp> 
#include </tcs/dev/lib/boost_1_38_0/boost/multi_index_container.hpp> 

#include <algorithm> 
#include<iostream> 
using namespace std; 
using namespace boost; 
using namespace multi_index; 

class marketdata 
{ 
    public: 
    int x; 
    float y; 
}; 


int main() 
{ 
    marketdata m[0]; 
    m[0].x=1; 
    m[0].y=1; 
    // boost::interprocess::list iterator itr; 

    using namespace boost::interprocess; 
    try{ 
     managed_shared_memory segment 
     (open_only 
     ,"MySharedMemory"); //segment name 
     typedef boost::interprocess::allocator<marketdata, managed_shared_memory::segment_manager> 
     ShmemAllocator; 
     typedef boost::interprocess::list<marketdata, ShmemAllocator> MyList; 
     MyList *mylist = segment.find<MyList>("MyList").first; 
boost::interprocess::list<marketdata, ShmemAllocator> :: iterator itr; 
      for(itr=mylist->begin(); itr != mylist->end(); ++itr) 
       { cout << (*itr).x << " "; 
       cout << endl; 
       mylist->pop_front(); 
       //multi_index::multi_index_container::delete_node_(itr); 
       sleep(1); 
       } 

     segment.destroy<MyList>("MyList"); 
    } 
    catch(...){ 
     shared_memory_object::remove("MySharedMemory"); 
     throw; 
    } 
    shared_memory_object::remove("MySharedMemory"); 
    return 0; 
} 
+0

Pourquoi les chemins absolus dans votre include? Cela va faire la mise à niveau vers les versions ultérieures vraiment nul! –

+0

Merci Billy pour votre suggestion. C'était juste pour un but de test, donc j'ai ajouté des chemins absolus. Vraiment changer cela – user531805

Répondre

0

Vous avez probablement besoin d'un mutex. Vous ne pouvez pas simplement ajouter et supprimer de la mémoire dans les applications thread/interprocessus en tenant compte du fait qu'un thread/processus peut essayer d'accéder à la mémoire alors qu'un autre l'utilise actuellement.

+0

Merci Herberto, – user531805

+0

J'ai essayé instruction push_back dans ma 2ème application aussi. Cela a fonctionné donc je suppose qu'il n'y a pas besoin de mutex comme dans notre cas écrire à la liste est beaucoup plus rapide que lire. Pouvons-nous supprimer un nœud particulier de la mémoire partagée? – user531805

+0

Je recommanderais toujours fortement un verrou. Parfois, il peut être drôle de travailler ou non, vous pourriez simplement avoir de la chance et ne pas lire et écrire en même temps. Sinon, votre programme va planter et brûler. Quoi qu'il en soit, je crois qu'il existe une méthode de désallocation quelque part ou autre. – neckbeard

Questions connexes