リストを持つ共有メモリを作成しました。私は、ノードをリストに続けて追加する必要があります。 私の別のアプリケーションはリストを読み込み、読み込んだコンテンツをポップします。 私が直面している問題は、ノードがポップされてもメモリを解放しないため、最初のアプリケーションがセグメンテーションフォルトをスローするポイントに挿入を継続している間です。新しいノードを割り当てるための最初のアプリケーションでそのスペースを利用できるようにノードを解放する方法として私を案内してください。ブーストライブラリを使用して共有メモリ内のノードのメモリを解放する
私のコードのスニペットは、あなたはおそらく、ミューテックスのロックを必要とする
#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;
}
あなたのインクルードの絶対パスはなぜですか?それは後のバージョンへのアップグレードを本当に吸うようにするつもりです! –
あなたの提案に感謝します。いくつかのテスト目的のためだけであり、絶対パスを追加しました。確かにそれを変更するだろう – user531805