首页 > 解决方案 > 进程崩溃时如何释放 boost::interprocess::named_mutex

问题描述

我曾经在共享内存boost::interprocess中创建数据结构。boost::multi_index有许多客户端进程将访问此数据结构。访问时,我会锁定数据结构。我遇到的问题是,一旦客户端进程正在访问数据结构并在没有释放占用的锁的情况下崩溃,那么所有其他客户端进程都无法访问数据结构。我用boost::interprocess::named_mutex,我知道boost::interprocess::file_lock进程崩溃时可以自动释放,但是因为他有很多限制,所以我没有用,不知道有没有什么好的办法解决这个问题,谢谢!

标签: c++boostshared-memoryboost-interprocessboost-multi-index

解决方案


不要在共享内存中放置互斥锁。的 boost 文档named_mutex说:

https://www.boost.org/doc/libs/1_70_0/doc/html/boost/interprocess/named_mutex.html

具有全局名称的互斥锁,因此可以从不同的进程中找到它。这个互斥锁不能放在共享内存中,每个进程都应该有自己的 named_mutex

使用命名互斥锁的全部意义在于,多个进程可以使用相同的名称创建自己的本地互斥锁对象,并且它们将共享一个可以同步的底层互斥锁。如果给定进程锁定了互斥体然后崩溃,底层共享互斥体将由操作系统自动释放,允许另一个进程锁定它(取决于操作系统,底层互斥体 API 可能会报告互斥体已异常解锁)。


推荐阅读