共享内存的boost容器是否实现了锁定?

问题描述 投票:0回答:4

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

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

如果有人能告诉我 boost 容器,特别是 hashmap,是否包含锁定,那将非常有帮助。如果你能把我指向 www 上我自己可以找到这些信息的地方,我会加分。

c++ boost shared-memory interprocess
4个回答
2
投票

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

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


1
投票

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

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

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


1
投票

他们没有内置同步。上次我在 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

0
投票

尝试使用

typedef
获得默认的
basic_managed_shared_memory
与窄字符的空互斥族:

typedef basic_managed_shared_memory<char, rbtree_best_fit<null_mutex_family>, iset_index> managed_shared_memory_null_mutex;

并且在

managed_shared_memory_null_mutex
之外使用健壮的进程间锁,比如system V semphore。

© www.soinside.com 2019 - 2024. All rights reserved.