2010-12-06 16 views
0

リストを持つ共有メモリを作成しました。私は、ノードをリストに続けて追加する必要があります。 私の別のアプリケーションはリストを読み込み、読み込んだコンテンツをポップします。 私が直面している問題は、ノードがポップされてもメモリを解放しないため、最初のアプリケーションがセグメンテーションフォルトをスローするポイントに挿入を継続している間です。新しいノードを割り当てるための最初のアプリケーションでそのスペースを利用できるようにノードを解放する方法として私を案内してください。ブーストライブラリを使用して共有メモリ内のノードのメモリを解放する

私のコードのスニペットは、あなたはおそらく、ミューテックスのロックを必要とする

#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

あなたのインクルードの絶対パスはなぜですか?それは後のバージョンへのアップグレードを本当に吸うようにするつもりです! –

+0

あなたの提案に感謝します。いくつかのテスト目的のためだけであり、絶対パスを追加しました。確かにそれを変更するだろう – user531805

答えて

0

です。あるスレッド/プロセスが別のスレッド/プロセスが現在メモリを使用している間にメモリにアクセスしようとしていることを考慮して、スレッド/プロセス間アプリケーションでメモリを追加および削除するだけではなりません。

+0

ありがとうHerberto、 – user531805

+0

私は2番目のアプリケーションでもpush_backステートメントを試してみました。それは私のケースでは、リストに書き込むよりもはるかに速く読むことがmutexの必要はないと思います。共有メモリから特定のノードを削除できますか? – user531805

+0

私はまだロックを強く勧めています。時にはそれは働いているかどうか面白くすることができます、あなただけの運があり、それは同時に読んで書くことができません。そうでない場合は、プログラムがクラッシュして焼き尽くされます。とにかく、どこか別の方法で割り当て解除メソッドがあると思います。 – neckbeard

関連する問題