gpt4 book ai didi

c++ - 当其他进程可能正在使用它时删除 boost interprocess_mutex

转载 作者:可可西里 更新时间:2023-11-01 17:57:22 27 4
gpt4 key购买 nike

我正在尝试将 interprocess_mutexmanaged_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; 是否安全。在doc对于interprocess_mutex,没有提到即使其他进程有对象引用它,它是否仍然被销毁。

我搜索了 this我猜我的选择是在这种情况下使用 boost::interprocess::shared_ptr。我在这里吗?这是我应该选择的选项吗?

最佳答案

来自文档:

Both processes share the same object

(强调在原文中)。

显然,您不能销毁一个对象,而其他代码可能仍会访问它,即使它是另一个进程中的代码,因为两个进程共享同一个对象

注意共享内存指针的情况是不同的。共享内存对象 不在进程之间共享。它管理的内存区域是,但 C++ 对象本身是进程私有(private)的。

另一方面,互斥锁位于共享内存区域,因此是共享的。

除非你想重用互斥锁占用的内存,否则你根本不需要delete _mtx,所以不要为共享指针或引用计数器而烦恼。删除共享内存对象只会取消映射相应内存段内的所有内容,就好像它从未存在过一样。

关于c++ - 当其他进程可能正在使用它时删除 boost interprocess_mutex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50691184/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com