Сбой приложения 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
}

Я закончил тайм-аут, как показано ниже. Кто-нибудь, кто может предложить решение, которое не ограничивает время блокировки?

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

1 ответ

Решение

Это кажется совершенно логичным для меня:)

При сбое приложения мьютекс, который отображается на механизм межпроцессного взаимодействия ОС (IPC), не освобождается. Когда ваше приложение перезапускается, оно пытается получить мьютекс безуспешно!

Я предполагаю, что ваше приложение имеет различные подсистемы (процессы), которые необходимо синхронизировать.

Вы должны разработать глобальную политику в случае сбоя одной из ваших подсистем, чтобы правильно управлять блокировкой. Например, в случае сбоя одной из ваших подсистем она должна попытаться разблокировать мьютекс при запуске. Это может быть сложно, так как другие подсистемы используют эту блокировку. Тайм-ауты тоже могут помочь. В любом случае вы должны разработать политику, имея в виду, что любой из ваших процессов может аварийно завершить работу, заблокировав мьютекс...

Конечно, если вам не нужна межпроцессная блокировка, используйте простые замки с областью видимости:)

my2c

Другие вопросы по тегам