-3
私はマップを共有する必要があります。親とフォークした子プロセスの中で共有メモリにC++マップデータ構造を保持する方法は?
map <string, vector< pair <string,string> > > repoMap;
それらの 1は、マップ内の要素を削除/追加したときに、それらのそれぞれが認識しているように。
例を挙げて小さくてすばやい解決策を提供してください。
私はマップを共有する必要があります。親とフォークした子プロセスの中で共有メモリにC++マップデータ構造を保持する方法は?
map <string, vector< pair <string,string> > > repoMap;
それらの 1は、マップ内の要素を削除/追加したときに、それらのそれぞれが認識しているように。
例を挙げて小さくてすばやい解決策を提供してください。
"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は良い本です。
お気軽に質問してください。でも、これについての調査をしてください。
幸運を祈る!
共有メモリアロケータが必要です。標準ライブラリの実装で十分です。残念ながら、標準では、共有メモリが実際に動作することは要求されていません(例えば、コンテナが内部的に空想的なポインタのみを使用する必要はありません)。 –
この[DrDoobsの記事]を確認してください(http://www.drdobbs.com/creating-stl-containers-in-shared-memory/184401639) –
Boost.Interprocessを使用してください:http://www.boost.org/doc/ libs/1_61_0/doc/html/interprocess.html – ecatmur