boost::interprocess::scoped_lock 应用程序在锁内崩溃

the*_*ail 5 c++ crash boost interprocess scoped-lock

我正在使用 boost::interprocess::scoped_lock,如果应用程序由于某种原因在范围内崩溃,则不会释放互斥锁。下次执行应用程序时(无需重新启动计算机),互斥锁被锁定。

这是如何工作的?我给出了下面代码的一个简单示例。

{
    boost::interprocess::named_mutex lockMutex(boost::interprocess::open_or_create, "lockName");
    boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(lockMutex);
    //crash here
}
Run Code Online (Sandbox Code Playgroud)

我最终做了如下超时。谁能想出一个不限制锁定时间的解决方案?

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

neu*_*uro 3

这对我来说似乎完全符合逻辑:)

当您的应用程序崩溃时,映射到操作系统进程间通信机制(IPC)的互斥锁不会被释放。当您的应用程序重新启动时,它尝试获取互斥体但没有成功!

我想您的应用程序有不同的子系统(进程)需要同步。

您必须制定一项全局策略,以防某个子系统崩溃,以便正确管理锁。例如,如果您的子系统之一崩溃,它应该尝试在启动时解锁互斥锁。当其他子系统使用该锁时,这可能会很棘手。超时也有帮助。无论如何,您必须设计策略,记住锁定互斥体时任何进程都可能崩溃......

当然,如果您不需要进程间锁定,请使用简单的作用域锁:)

我的2c