进程崩溃时如何释放boost :: interprocess :: named_mutex

时间:2019-07-03 08:03:20

标签: c++ boost shared-memory boost-interprocess boost-multi-index

我使用boost::interprocess在共享内存中创建了boost::multi_index数据结构。有许多客户端进程将访问此数据结构。访问时,我将锁定数据结构。我遇到的问题是,一旦客户端进程正在访问数据结构并且崩溃而没有释放占用的锁,则所有其他客户端进程将无法访问数据结构。我使用boost::interprocess::named_mutex,我知道boost::interprocess::file_lock可以在进程崩溃时自动释放,但是由于他有很多限制,所以我没有用,我不知道是否有任何好处解决这个问题的方法,谢谢!

2 个答案:

答案 0 :(得分:1)

请勿在共享内存中放置互斥锁。 named_mutex的增强文档说:

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

  

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

使用名为 的互斥锁的全部要点是,多个进程可以使用相同的名称创建自己的本地互斥锁对象,并且它们将共享可以在其上同步的基础互斥锁。如果给定进程锁定了互斥锁然后崩溃,则操作系统将自动释放基础共享的互斥锁,从而允许另一个进程对其进行锁定(取决于操作系统,基础互斥锁API可能会报告互斥锁已被异常解锁)。 / p>

答案 1 :(得分:0)

我想您可以尝试使用timed_lock访问互斥锁,如果超时,则可以使用remove强制删除互斥锁。