Повышение межпроцессных мьютексов и проверка на отказ

Мне нужна межпроцессная синхронизация вокруг аппаратного обеспечения. Поскольку этот код должен работать в 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.

Спасибо энди

Ответы на вопрос(4)

Ваш ответ на вопрос