用于共享内存的增强容器是否实现了锁定?

时间:2018-09-20 06:13:28

标签: c++ boost shared-memory interprocess

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

我在文档中找不到此信息,并且试图通读我迅速迷失的增强资源,即使google也无法提供答案。当然,使用boost库实现互斥锁很容易,但是我不想以冗余的锁定机制结束。

如果有人可以告诉我,boost容器(尤其是hashmap)是否带有锁定功能,那将非常有帮助。奖励积分是,如果您可以指向我自己可以找到此信息的www。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

除了@sehe答案,容器级别的锁定也太细微而无法使用。许多操作需要对容器函数的多个调用,并且这些调用必须作为一个原子序列完成。例如,在:

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

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

答案 2 :(得分:0)

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

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