【问题标题】:boost::interprocess::scoped_lock application crash inside lockboost::interprocess::scoped_lock 应用程序在锁内崩溃
【发布时间】:2011-06-07 15:50:20
【问题描述】:

我正在使用 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
}

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

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();
        }
    }

【问题讨论】:

    标签: c++ boost crash interprocess scoped-lock


    【解决方案1】:

    这对我来说似乎很合乎逻辑:)

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

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

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

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

    my2c

    【讨论】:

    • Boost 使用文件来模拟命名的互斥锁。如果应用程序崩溃 - 文件保留在文件系统中......不使用操作系统互斥锁。检查来源...
    • @Victor:无论使用何种操作系统机制,正如我所回答的,问题在于没有管理问题的策略。无需查看库代码即可说明这一点。 Boost使用文件实现命名互斥不是问题,问题是共享资源的管理...
    猜你喜欢
    • 2012-05-20
    • 2011-02-22
    • 1970-01-01
    • 2019-11-13
    • 2021-05-19
    • 1970-01-01
    • 2010-11-18
    • 2012-03-22
    • 1970-01-01
    相关资源
    最近更新 更多