【发布时间】:2018-06-05 02:30:34
【问题描述】:
我正在尝试将interprocess_mutex 与managed_windows_shared_memory 一起使用。在我的项目中,多个进程在以下代码中创建了一个class A 的实例。
using namespace boost::interprocess;
class A
{
managed_windows_shared_memory* _shm;
interprocess_mutex* _mtx;
}
A::A()
{
_shm = new managed_windows_shared_memory{ open_or_create, "shm", 1024 };
_mtx = _shm->find_or_construct<interprocess_mutex>("mtx")();
}
A::~A()
{
delete _mtx;
delete _shm;
}
我可以看到在~A() 中调用delete _shm; 是安全的,因为managed_windows_shared_memory 只有在每个使用它的进程都销毁managed_windows_shared_memory 对象时才会被销毁,如doc 中所写。
但是,我不确定在~A() 中调用delete _mtx; 是否安全。在interprocess_mutex的doc中,并没有提到即使其他进程有对象引用它是否仍然被销毁。
我搜索了this,我猜我的选择是在这种情况下使用boost::interprocess::shared_ptr。我在这里吗?这是我应该采取的选择吗?
【问题讨论】:
-
这是一个操作系统实现细节,Boost 文档小心避免提及的那种细节。您可以放心地假设操作系统在底层命名互斥内核对象上使用引用计数。只有最后一个正在运行的进程发出的最后一次调用才会将其计数为 0 并将其销毁。你没有问题。
-
感谢您的评论。然而,就我而言,我使用的是匿名互斥锁,而不是命名互斥锁。 匿名互斥体和命名互斥体取自this boost doc。我已经进行了一些测试,似乎删除由其他进程持有的
interprocess_mutex会导致错误。我将发布我的测试代码。如果我错了,请纠正我。 -
根据boost的说法:如果在调用析构函数后任何进程使用互斥锁,结果是未定义的。我猜如果你有引用计数,你可以在拥有唯一对象时删除,所以使用 shared_ptr 映射到共享内存可能是答案。
标签: c++ boost boost-interprocess