c++ - boost interprocess_mutex 的“进程持久性”是什么意思?
问题描述
从Boost Interprocess 文档中,(匿名)进程共享互斥锁类型具有Process persistence,它定义如下:
进程持久性:该机制一直持续到所有打开该机制的进程都关闭它、退出或崩溃。
由于这些互斥锁是匿名的,因此要共享它们必须放置在一些共享内存中(具有更长的持久性,取决于平台的内核或文件系统)。
让我们考虑这个最小的例子:
namespace bi = boost::interprocess;
{
bool isMemoryCreated = /*assume function to get this info*/;
bi::shared_memory_object shm = [&]() -> bi::shared_memory_object
{
if (isMemoryCreated)
{
return {bi::open_only, "sharemem", bi::read_write};
}
else
{
bi::shared_memory_object shm{bi::create_only, "sharemem", bi::read_write};
shm.truncate(sizeof(bi::interprocess_mutex));
return shm;
}
}();
//Map the whole shared memory in this process
region = bi::mapped_region(shm, bi::read_write);
void * address = region.get_address();
bi::interprocess_mutex mutex = [&]()
{
if (isMemoryCreated)
{
return static_cast<bi::interprocess_mutex*>(address);
}
else
{
return new (address) bi::interprocess_mutex;
}
}();
std::cout << mutex->try_lock() << std::endl;
// wait on external condition
mutex->unlock();
bi::shared_memory_object::remove("sharemem");
}
以下是在 macOS 上运行它的一些结果:
如果运行processA直到正常完成然后processB,两个进程都必须创建内存,并成功获取锁。这正如预期的那样。
如果运行processA并“强制退出”它,它永远不会到达释放锁和删除内存的清理代码。现在,运行processB内存将已经存在(
isMemoryCreated
这是真的),这是预期的,因为共享内存至少具有内核持久性。但是processB 将无法锁定 mutex,这似乎与 boost 文档相矛盾:互斥锁应该具有进程持久性,因此当processA退出时它不应该进一步持久化。
这是图书馆的错误吗?或者“过程持久性”是否意味着与此不同的东西?
解决方案
例如,POSIX 互斥锁(在 boost::interprocess 的 Linux 实现中使用)不拥有它的内存,因此它的持久性是它所在的内存的持久性。
该代码在文件系统的命名文件中创建了一个匿名互斥锁。互斥体的持久性成为它所在的命名文件的持久性。
当文件被取消链接时,互斥锁的持久性就变成了进程的持久性。
推荐阅读
- android - android,我的片段在过渡时崩溃
- vb.net - 错误 已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭
- python - 熊猫从具有更大索引的列表中添加列
- ip - 如何在 Windows Server 2 节点集群中设置 IP 地址
- operating-system - 银行家算法中的过程需求是否会变成负数?
- macos - Heroku Multi-Factor Authentication 无法验证您的身份
- flutter - 错误“找不到正确的提供程序
高于此消费者 " - terraform - Terraform 简单脚本显示“错误:启动源实例时出错:VPCIdNotSpecified:此用户没有默认 VPC”
- vb.net - 将表单加载并安装到面板中
- discord - 不使用自我机器人监控不和谐消息?