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