【问题标题】:Do the boost containers for shared memory implement locking?共享内存的 boost 容器是否实现了锁定?
【发布时间】:2019-02-24 09:16:59
【问题描述】:

我正在尝试使用 c++ boost 库在(boost)共享内存位置创建哈希图。到目前为止一切顺利,这一切都很好地记录在boost documentation 中。但是,我想在我创建的地图上有一个互斥锁,但我不明白这是否已经是 hashmap 容器的一部分。

我在文档中找不到此信息,并试图通读我很快迷路的提升源,即使谷歌也没有提供答案。当然,使用 boost 库实现互斥锁很容易,但我不想以冗余锁定机制告终。

如果有人能告诉我 boost 容器,尤其是 hashmap 是否包含锁定功能,那将非常有帮助。如果您可以将我指向 www 上我自己可以找到此信息的位置,则可以加分。

【问题讨论】:

  • 不熟悉boost,而是使用标准容器...但是如果没有描述,很可能也没有实现线程安全。这样做会与 C++ 范式相矛盾:只提供真正需要的东西;如果哈希映射将在单线程环境中使用,那么这种保护将毫无代价地牺牲性能......
  • 旁注:正如您提到的共享内存 - 也请查看 here
  • 感谢@Aconcagua。共享内存 hashmap 容器的来源似乎指向通用容器,所以听起来你是对的。当我完成代码后,我可以做一个小测试,我们肯定会知道。
  • Here 提到了并发散列映射的一些实现,作为替代可能有用。 Facebook Folly 也有 one 等。

标签: c++ boost shared-memory interprocess


【解决方案1】:

boost“共享内存容器”只是 Boost Container 中通用容器的别名。事实上,它们只有在与适当的分配器类型一起使用时才成为“共享内存”。

因此,它们没有内置同步功能(当然,除非记录在案)。

【讨论】:

    【解决方案2】:

    除了@sehe 的回答之外,容器级锁定太细粒度而没有用处。许多操作需要多次调用容器函数,并且这些调用必须作为一个原子序列来完成。例如,在:

    if(!container.empty()) {
        auto last = container.back();
        container.pop_back();
        // process last
    }
    

    在所有三个容器调用期间必须保持一个锁,而不是每次调用都锁定和释放。

    【讨论】:

      【解决方案3】:

      它们没有内置同步功能。上次我在 Writer 和 Reader 之间实现类似的过程是: Writer 为 SharedMutex 创建一个共享内存段,并为 sharedVector 创建另一个共享内存段。 Writer 获取(SharedMutex 的)内存段的地址,并将此引用存储到本地互斥变量。之后,它锁定它并开始在 shMem 中写入向量。 一旦解锁互斥体,Reader 就会开始读取值。

      boost 文档用以下代码行对其进行了描述:

      using namespace boost::interprocess;
      shared_memory_object::remove("SharedMutex");
      shared_memory_object shmObj(create_only, "SharedMutex", read_write);
      shmObj.truncate(sizeof(SharedMutex));
      mapped_region region(shmObj, read_write);
      void * addr = region.get_address();
      SharedMutex * shared_mtx = new (addr) SharedMutex;
      scoped_lock<interprocess_mutex> lock(shared_mtx->mutex);
      //Start Writing in the Vector shared segment, SharedMutex is boost::interprocess::mutex
      

      【讨论】:

      • 你能分享你的SharedMutex对象的内容吗?
      猜你喜欢
      • 1970-01-01
      • 2014-11-30
      • 2019-12-17
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      相关资源
      最近更新 更多