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