gpt4 book ai didi

c++ - 将 STL 容器用于 boost::interprocess::managed_shared_memory

转载 作者:行者123 更新时间:2023-11-30 04:00:23 25 4
gpt4 key购买 nike

考虑以下情况:

class Helper
{
public:
// Getters and setters are present!
private:
int i;
std::map<int, boost::interprocess::managed_shared_memory> shm;
}

int main()
{
boost::interprocess::managed_shared_memory shmInfo(boost::interprocess::open_or_create, "Test", 1024);

boost::interprocess::map<int, Helper> myMap = shmInfo.construct< boost::interprocess::map<int, Helper> >("Memory");
}

myMap(它是intHelper 的映射)构建在shared_memory 上。反过来,我希望 Helper 保存 intboost::interprocess::managed_shared_memory 的映射。

当我尝试在 Helper 中使用 std::map 时,出现编译器错误:

error C2248: 'boost::interprocess::basic_managed_shared_memory::basic_managed_shared_memory' : cannot access private member declared in class 'boost::interprocess::basic_managed_shared_memory'

我怎样才能做到这一点?

最佳答案

好的,这是一个有效的版本 Live On Coliru

让我来解决您的代码存在的一些问题:


  1. 让我们从头开始

    class Helper
    {
    public:
    // Getters and setters are present!
    private:
    int i;
    std::map<
    -----------^
  2. 使用 std::map对于共享内存分配器来说通常很麻烦,因为它直接从构造函数内部进行分配。 boost::container::mapboost::interprocess::map不要,所以在使用 Boost 进程间分配器时你应该更喜欢它们。使用模板别名,您可以减少声明此类共享 map 的复杂性:

    template <typename T> using shm_alloc = bip::allocator<T, bip::managed_shared_memory::segment_manager>;
    template <typename K, typename V> using shared_map = bip::map<K, V, std::less<K>, shm_alloc<std::pair<K const, V> > >;

    现在您可以“只”说 shared_map<K,V>你以前会说 std::map<K,V> .

                      int, boost::interprocess::managed_shared_memory> shm;
    --------------------------------------------^
  3. 这里有两点:

    1. boost::interprocess::managed_shared_memory不可复制(因为它拥有共享内存资源)。在我的示例中,我使用了 shared_ptr<managed_shared_memory>解决这个问题。如果您确定对象的生命周期将长于包含指针的映射的生命周期,您可能会使用原始指针。

    2. Helper 中使用标准分配的容器毫无意义位于共享内存中的类(std::map 将简单地指向进程本地堆上的对象,并且当从另一个进程引用时会导致 UB)。因此,您应该指定一个 boost 进程间分配器以将容器元素放入共享内存。出于技术原因,这意味着您必须指定键比较器(尽管它只是默认事件,std::less<K>)。

    }
    -^
  4. 缺少 ; :)

    int main()
    {
    boost::interprocess::managed_shared_memory shmInfo(boost::interprocess::open_or_create, "Test", 1024);

    boost::interprocess::map
    -------------------------^
  5. 即使您现在使用 boost::interprocess::map ,您仍然没有指明分配器类型。同样(如上所述),您可以使用 shared_map别名。

                                <int, Helper> 

    -----------------------------------------^
  6. 缺少 *指针结果类型。

                                              myMap = shmInfo.construct< boost::interprocess::map<int, Helper> >("Memory");

    ----------------------------------------------------------------------------------------------------------------------^
  7. 您忘记调用构造函数代理对象。

    }
  8. 宽松的评论:

    • 您需要Helper 中的构造函数,以便您可以将适当的分配器实例传递给shm 的构造函数。领域
    • 使用 typedef(或者在我的示例中,模板别名)真的让您的代码更易于维护。
    • 注意这里有两个分配器实例,outer_alloc (对于 Helpers map )和 inner_alloc (对于 Helper::shm)

完整的工作样本

#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/map.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>

namespace bip = boost::interprocess;

using ShMemRef = boost::shared_ptr<bip::managed_shared_memory>;
template <typename T> using shm_alloc = bip::allocator<T, bip::managed_shared_memory::segment_manager>;
template <typename K, typename V> using shared_map = bip::map<K, V, std::less<K>, shm_alloc<std::pair<K const, V> > >;

class Helper
{
public:
using inner_alloc = shm_alloc<std::pair<int, ShMemRef>>;
Helper(inner_alloc const& instance) : shm(instance) {}
private:
int i;
shared_map<int, ShMemRef> shm;
};

int main()
{
ShMemRef shmInfo = boost::make_shared<bip::managed_shared_memory>(bip::open_or_create, "Main", 1024);

using outer_alloc = shm_alloc<std::pair<const int, Helper>>;
outer_alloc oa_instance(shmInfo->get_segment_manager());

shared_map<int, Helper>* myHelpers = shmInfo->construct<shared_map<int, Helper>>("Memory")(oa_instance);

Helper::inner_alloc ia_instance(shmInfo->get_segment_manager());
Helper helper1(ia_instance), helper2(ia_instance), helper3(ia_instance);
myHelpers->emplace(1, helper1);
myHelpers->emplace(2, helper2);
myHelpers->emplace(3, helper3);
}

关于c++ - 将 STL 容器用于 boost::interprocess::managed_shared_memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26342351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com