【问题标题】:How to keep a c++ map data structure in shared memory?如何在共享内存中保留 C++ 映射数据结构?
【发布时间】:2016-09-05 09:15:19
【问题描述】:

我需要分享一张地图:

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

在父进程和分叉子进程之间,以便他们每个人都知道何时 其中之一在地图中添加/删除元素。

请通过示例提供一个小而快速的解决方案。

【问题讨论】:

  • 您需要一个共享内存分配器,并希望您的标准库实现足够好。不幸的是,标准不要求共享内存实际工作(例如,它不要求容器只在内部使用花哨的指针)。
  • std::map 的第四个模板参数是分配器。您需要创建一个自定义分配器,它将在您预定义的共享内存中分配存储的对象。
  • C++11 多线程和良好的互斥管理怎么样?这是一个好的解决方案吗?
  • “请为我做我的工作和研究。”不,伙计..

标签: c++ data-structures shared-memory


【解决方案1】:

“跟踪”在低级语言编程中并不是真正的东西。您可以执行以下操作:

  • 创建一个检查内容的函数,即线程安全
  • 制作一个添加内容和报告更改的函数,即线程安全
  • 创建一个删除内容并报告更改的函数,即线程安全

我将给出一个快速的解决方案,但是你必须学习更多才能使它更漂亮。

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 是一本好书。

请随时提出问题,但也请对此进行一些研究。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2015-06-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多