我正在尝试使用 C++ boost 库在(boost)共享内存位置创建哈希图。到目前为止一切顺利,这一切都很好地记录在boost文档中。但是,我想在我创建的地图上有一个互斥锁,但我不明白这是否已经是 hashmap 容器的一部分。
我无法在文档中找到此信息并试图通读我很快迷路的 boost 源,甚至谷歌也没有提供答案。当然,使用 boost 库实现互斥锁很容易,但我不想以冗余锁定机制结束。
如果有人能告诉我 boost 容器,特别是 hashmap,是否包含锁定,那将非常有帮助。如果你能把我指向 www 上我自己可以找到这些信息的地方,我会加分。
boost“共享内存容器”只是Boost Container中通用容器的别名。事实上,当与适当的分配器类型一起使用时,它们只会变成“用于共享内存”。
因此,它们没有内置同步(当然除非有记录)。
除了@sehe 的回答,容器级别的锁定太细粒度以至于没有用。许多操作需要多次调用容器函数,并且这些调用必须作为一个原子序列来完成。例如,在:
if(!container.empty()) {
auto last = container.back();
container.pop_back();
// process last
}
在所有三个容器调用期间必须持有一个锁,而不是为每个调用锁定和释放。
他们没有内置同步。上次我在 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
尝试使用
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。