我正在使用boost :: interprocess :: scoped_lock,如果应用程序由于某种原因在范围内导致mutex未释放。 下次执行应用程序时(不重新启动计算机),互斥锁将被锁定。
这是如何工作的? 我举一个下面代码的简单例子。
{
boost::interprocess::named_mutex lockMutex(boost::interprocess::open_or_create, "lockName");
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(lockMutex);
//crash here
}
我最终做了如下所示的超时。谁能想出一个不限制锁定时间的解决方案?
boost::interprocess::named_mutex named_mtx(boost::interprocess::open_or_create, lockName.c_str());
while(true)
{
if(named_mtx.try_lock())
{
break;
}
if(!named_mtx.timed_lock(boost::get_system_time() + boost::posix_time::milliseconds(TIMEOUT_MILLISECONDS)))
{
named_mtx.unlock();
}
}
答案 0 :(得分:2)
这对我来说似乎完全符合逻辑:)
当您的应用程序崩溃时,映射到您的OS进程间通信机制(IPC)的互斥锁不会被释放。当您的应用程序重新启动时,它会尝试获取互斥锁而不会成功!
我认为您的应用程序具有需要同步的不同子系统(进程)。
如果您的某个子系统崩溃,您必须设计一个全局策略来正确管理锁定。例如,如果您的某个子系统崩溃,它应该在启动时尝试解锁互斥锁。它可能很棘手,因为其他子系统使用该锁。超时也可以提供帮助。在任何情况下,您必须设计策略时要记住,在锁定互斥锁时,您的任何进程都可能崩溃...
当然,如果您不需要进程间锁定,请使用简单的范围锁:)
MY2C