Повышение межпроцессных мьютексов и проверка на отказ
Мне нужна межпроцессная синхронизация вокруг аппаратного обеспечения. Поскольку этот код должен работать в Windows и Linux, я использую мьютексы Boost Interprocess. Все работает хорошо, прими мой метод проверки отказа от мьютекса. Существует вероятность того, что это может произойти, и поэтому я должен подготовиться к этому.
Я отказался от мьютекса в своем тестировании и, конечно же, когда я использую scoped_lock для блокировки мьютекса, процесс блокируется на неопределенный срок. Я решил, что обойти это можно с помощью механизма тайм-аута в scoped_lock (так как много времени, затрачиваемого Googling на методы для объяснения этого, на самом деле не показывают много, boost не делает много из-за этого из-за переносимости).
Без дальнейших церемоний вот что у меня есть:
#include <boost/interprocess/sync/named_recursive_mutex.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
typedef boost::interprocess::named_recursive_mutex MyMutex;
typedef boost::interprocess::scoped_lock<MyMutex> ScopedLock;
MyMutex* pGate = reinterpret_cast<MyMutex*>(new MyMutex(boost::interprocess::open_or_create, "MutexName");
{
// ScopedLock lock(*pGate); // this blocks indefinitely
boost::posix_time::ptime timeout(boost::posix_time::microsec_clock::local_time() + boost::posix_time::seconds(10));
ScopedLock lock(*pGate, timeout); // a 10 second timeout that returns immediately if the mutex is abandoned ?????
if(!lock.owns()) {
delete pGate;
boost::interprocess::named_recursive_mutex::remove("MutexName");
pGate = reinterpret_cast<MyMutex*>(new MyMutex(boost::interprocess::open_or_create, "MutexName");
}
}
Это, по крайней мере, идея. Три интересных момента:
Когда яне используйте объект тайм-аута, и мьютекс отменяется, ctor ScopedLock блокируется бесконечно. Это ожидается.Когда ядействительно использовать тайм-аут, и мьютекс отменяется, ctor ScopedLock немедленно возвращается и сообщает мне, что ему не принадлежит мьютекс. Хорошо, возможно это нормально, но почему это не ждет 10 секунд, о которых я тоже говорю?Когда мьютексне заброшени я использую тайм-аут, ctor ScopedLock по-прежнему немедленно возвращается, сообщая мне, что он не может заблокировать или получить контроль над мьютексом, и я выполняю действия по удалению мьютекса и его повторному преобразованию. Это совсем не то, что я хочу.Итак, что мне не хватает при использовании этих объектов? Возможно, это смотрит мне в лицо, но я не вижу этого и поэтому прошу помощи.
Я должен также упомянуть, что из-за того, как это оборудование работает, если процесс не может получить право собственности на мьютекс в течение 10 секунд, мьютекс отменяется. Фактически, я мог бы ждать всего 50 или 60 миллисекунд, но 10 секунд - это хорошее «круглое» число щедрости.
Я компилирую на Windows 7, используя Visual Studio 2010.
Спасибо энди