2016-09-05 13 views
-3

私はマップを共有する必要があります。親とフォークした子プロセスの中で共有メモリにC++マップデータ構造を保持する方法は?

map <string, vector< pair <string,string> > > repoMap; 

それらの 1は、マップ内の要素を削除/追加したときに、それらのそれぞれが認識しているように。

例を挙げて小さくてすばやい解決策を提供してください。

+1

共有メモリアロケータが必要です。標準ライブラリの実装で十分です。残念ながら、標準では、共有メモリが実際に動作することは要求されていません(例えば、コンテナが内部的に空想的なポインタのみを使用する必要はありません)。 –

+0

この[DrDoobsの記事]を確認してください(http://www.drdobbs.com/creating-stl-containers-in-shared-memory/184401639) –

+2

Boost.Interprocessを使用してください:http://www.boost.org/doc/ libs/1_61_0/doc/html/interprocess.html – ecatmur

答えて

0

"Keeping track"は、低言語プログラミングでは本物ではありません。あなたは次の操作を行うことができます。

  • それは、コンテンツやレポートの変更を追加する機能を作成し、スレッドセーフ
  • で、内容をチェック機能を作るが、それはスレッドセーフ
  • あるコンテンツを削除する機能を作成し、スレッドセーフであることを報告します。

私はすぐに解決策を提供するつもりですが、次にそれをもっと魅力的にする必要があります。

C++ 11のキーは、std::mutexを使用しています。これはマップをロックします。たとえば:

std::mutex lock; //must be accessible by all threads, either being global (not the best, but will work) or put it in your class body 
void addElementToMap(map<string, vector< pair <string,string> > >& myMap, string key, pair element) 
{ 
    std::lock_guard<std::mutex> guard(lock); 
    myMap[key] = element; 
    //the guard will be unlocked when destroyed 
} 

は今、あなたは、例えばによって、この関数を呼び出すためにstd::threadを使用することができます。

std::thread myThread(addElementToMap, std::ref(mapToModify), key, element); 

通常のコピーがスレッドに供給されているので、あなたがここにstd::ref()を使用しています。

C++ 11の新しい機能をすべて習得しなければならないようです。 Thisは良い本です。

お気軽に質問してください。でも、これについての調査をしてください。

幸運を祈る!

関連する問題