C++ boost::进程间::作用域锁定应用程序在锁内崩溃

C++ boost::进程间::作用域锁定应用程序在锁内崩溃,c++,boost,crash,interprocess,scoped-lock,C++,Boost,Crash,Interprocess,Scoped Lock,我使用的是boost::interprocess::scoped_lock,如果应用程序由于某种原因在作用域内崩溃,互斥锁不会被释放。 下次执行应用程序时(不重新启动计算机),互斥锁将被锁定 这是如何运作的? 下面我给出一个简单的代码示例 { boost::interprocess::named_mutex lockMutex(boost::interprocess::open_or_create, "lockName"); boost::interprocess::scoped

我使用的是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
}

在我看来,这似乎是完全合乎逻辑的:)

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

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

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

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


my2c

Boost使用文件模拟命名互斥体。如果应用程序崩溃-文件仍保留在文件系统中。。。不使用操作系统互斥体。查看资料来源…@Victor:无论使用什么操作系统机制,正如我所回答的,问题在于没有管理问题的策略。不需要看库代码就知道了。Boost使用文件实现命名互斥不是问题,问题是管理共享资源。。。
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();
        }
    }