Synchronization 崩溃后,名为mutex的boost进程间互斥仍然被获取

Synchronization 崩溃后,名为mutex的boost进程间互斥仍然被获取,synchronization,ipc,mutex,interprocess,boost-interprocess,Synchronization,Ipc,Mutex,Interprocess,Boost Interprocess,我使用的是boost::interpass::scoped_lock和超时;我正在运行Linux操作系统 在我的一次测试中,我遇到了一个崩溃:从那时起,每次我尝试再次运行应用程序时,它都会卡在我创建锁的地方;看起来互斥锁仍然以某种方式获得(不可能有使用它的进程正在运行) 最重要的是,如果你看下面的代码,我希望在150微秒后,计时的作用域锁定返回给我一个错误..但事实并非如此..它只是挂在那里 #include <boost/interprocess/sync/named_mut

我使用的是
boost::interpass::scoped_lock
超时
;我正在运行Linux操作系统

在我的一次测试中,我遇到了一个崩溃:从那时起,每次我尝试再次运行应用程序时,它都会卡在我创建锁的地方;看起来互斥锁仍然以某种方式获得(不可能有使用它的进程正在运行)

最重要的是,如果你看下面的代码,我希望在150微秒后,计时的
作用域锁定返回给我一个错误..但事实并非如此..它只是挂在那里

      #include <boost/interprocess/sync/named_mutex.hpp>
      namespace bi = boost::interprocess;
      bi::named_mutex m_mutex;

 try{
      boost::posix_time::ptime pt( 
          boost::posix_time::microsec_clock::local_time() ) ;

      pt+= boost::posix_time::microseconds( 150 );
      bi::scoped_lock< bi::named_mutex > lock( m_mutex, pt );

      if( !lock.owns() ){
        FATAL( "I didn't acquire the lock." );
           return EXIT_FAILURE;
      }
     ....
#包括
名称空间bi=boost::进程间;
bi::命名为_mutex m_mutex;
试一试{
boost::posix_time::ptime pt(
boost::posix_time::microsec_clock::local_time());
pt+=boost::posix_time::微秒(150);
bi::作用域_锁锁(m_互斥锁,pt);
如果(!lock.owns()){
致命(“我没有拿到锁。”);
返回退出失败;
}
....
我的问题如下:

  • 如何确保已销毁
    boost::进程间
    命名互斥体?(因此,如何查看进程间的共享互斥体以及如何销毁它们)
  • 为什么获取互斥锁在150微秒后不会返回?下面的代码中是否有错误
  • 非常感谢


    AFG

    我找到了解决方案:我没有调用以下命令来销毁互斥锁

     boost::interprocess::named_mutex::remove( "MutexName" );
    
    此代码进行了所有必要的清理

    boost::interprocess::named_mutex::remove( "MutexName" ); 
    
    这不应该是正确的。
    这也将解锁所有其他进程的互斥锁。

    命名互斥锁在unix上崩溃时不会释放,请尝试boost::interprocess::file_lock。 当崩溃发生时,锁被释放。

    不要使用本地时间()函数,而不要使用通用时间() boost::posix_time::ptime abs_time=boost::posix_time::microsec_clock::universal_time()+boost::posix_time::毫秒(150)

    作用域锁定锁(互斥锁、abs\u时间)

    如果进程崩溃,您应该捕获崩溃信号并解锁指定的_互斥锁,或者使用一个线程作为计时器来检查死锁并解锁它


    使用boost::interprocess::file_lock会小心地引入新问题!!!

    在我的情况下,它仍然是在Windows上获得的。您可以使用宏将命名的_mutex内部实现更改为Windows mutex或posix mutex,但它也有一些问题,您可以查看boost/interprocess gitbub,有一些更新,但latest boost版本不合并它,您应该更改进程间源代码。或者您只能使用OS API