Сбой приложения boost :: interprocess :: scoped_lock внутри блокировки - PullRequest
4 голосов
/ 07 июня 2011

Я использую 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 Ответ

2 голосов
/ 07 июня 2011

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

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

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

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

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

my2c

...