共享内存的提升容器是否实现锁定?
Do the boost containers for shared memory implement locking?
我正在尝试使用 C++ boost 库在(boost)共享内存位置创建哈希图。到目前为止一切顺利,这一切都很好地记录在 boost documentation 中。但是,我想在我创建的地图上有一个互斥锁,但我不明白这是否已经是 hashmap 容器的一部分。
我无法在文档中找到此信息,并试图通读我很快迷路的 boost 源,甚至 google 也没有提供答案。当然,使用 boost 库实现互斥锁很容易,但我不想以冗余锁定机制结束。
如果有人能告诉我 boost 容器(尤其是 hashmap)是否包含锁定功能,那将非常有帮助。如果您能将我指向 www 上我可以自己找到此信息的位置,将加分。
boost "containers for shared memory" 只是 Boost Container 中通用容器的别名。事实上,它们只有在与适当的分配器类型一起使用时才会变成 "for shared memory"。
因此,它们没有内置同步功能(当然除非有记录)。
除了@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
我正在尝试使用 C++ boost 库在(boost)共享内存位置创建哈希图。到目前为止一切顺利,这一切都很好地记录在 boost documentation 中。但是,我想在我创建的地图上有一个互斥锁,但我不明白这是否已经是 hashmap 容器的一部分。
我无法在文档中找到此信息,并试图通读我很快迷路的 boost 源,甚至 google 也没有提供答案。当然,使用 boost 库实现互斥锁很容易,但我不想以冗余锁定机制结束。
如果有人能告诉我 boost 容器(尤其是 hashmap)是否包含锁定功能,那将非常有帮助。如果您能将我指向 www 上我可以自己找到此信息的位置,将加分。
boost "containers for shared memory" 只是 Boost Container 中通用容器的别名。事实上,它们只有在与适当的分配器类型一起使用时才会变成 "for shared memory"。
因此,它们没有内置同步功能(当然除非有记录)。
除了@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