Освобождение памяти узла в разделяемой памяти с использованием библиотеки повышения - PullRequest
0 голосов
/ 06 декабря 2010

Я создал общую память, в которой есть список. Мне нужно постоянно добавлять узлы в список. Мое другое приложение читает список и выскакивает прочитанное содержимое. Проблема, с которой я сталкиваюсь, состоит в том, что узел popped не освобождает память, поэтому, пока первое приложение продолжает вставлять в точку, оно вызывает ошибку сегментации. Пожалуйста, объясните мне, как освободить узел, чтобы это пространство могло быть использовано моим первым приложением для выделения нового узла.

Фрагмент моего кода

#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;
}

1 Ответ

0 голосов
/ 06 декабря 2010

Вам, вероятно, нужна блокировка мьютекса.Нельзя просто добавлять и удалять память в многопоточных / многопроцессорных приложениях, учитывая, что один поток / процесс может пытаться получить доступ к памяти, в то время как другой в настоящее время использует ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...