c++ - 进程崩溃时如何释放 boost::interprocess::named_mutex
问题描述
我曾经在共享内存boost::interprocess
中创建数据结构。boost::multi_index
有许多客户端进程将访问此数据结构。访问时,我会锁定数据结构。我遇到的问题是,一旦客户端进程正在访问数据结构并在没有释放占用的锁的情况下崩溃,那么所有其他客户端进程都无法访问数据结构。我用boost::interprocess::named_mutex
,我知道boost::interprocess::file_lock
进程崩溃时可以自动释放,但是因为他有很多限制,所以我没有用,不知道有没有什么好的办法解决这个问题,谢谢!
解决方案
不要在共享内存中放置互斥锁。的 boost 文档named_mutex
说:
https://www.boost.org/doc/libs/1_70_0/doc/html/boost/interprocess/named_mutex.html
具有全局名称的互斥锁,因此可以从不同的进程中找到它。这个互斥锁不能放在共享内存中,每个进程都应该有自己的
named_mutex
。
使用命名互斥锁的全部意义在于,多个进程可以使用相同的名称创建自己的本地互斥锁对象,并且它们将共享一个可以同步的底层互斥锁。如果给定进程锁定了互斥体然后崩溃,底层共享互斥体将由操作系统自动释放,允许另一个进程锁定它(取决于操作系统,底层互斥体 API 可能会报告互斥体已异常解锁)。
推荐阅读
- java - 使用 Spring,我可以创建几个可选的路径变量吗?
- javascript - 用 vuejs 做一个响应式组件
- docker - AttributeError:模块'_version'在docker上的mysql连接器中没有属性'version'
- java - 将 Java FX 与 TMC Bean 一起使用
- r - 无法在 R 中安装 DPpackage
- javascript - jsp 包含 jsp 不重新加载菜单导航栏
- postgresql - 如何在时间范围内添加唯一约束?
- python - 根据第一个元素从列表列表中仅返回唯一出现
- android - 当我从 XML 和代码设置 textField 的属性时,什么会优先考虑?
- android - 如何强制Android应用程序后台刷新?