Zwiększenie muteksów międzyprocesowych i sprawdzanie porzucenia

Mam potrzebę synchronizacji międzyprocesowej wokół części sprzętu. Ponieważ ten kod będzie musiał działać na systemach Windows i Linux, zawijam z muteksami Boost Interprocess. Wszystko działa dobrze, przyjmij moją metodę sprawdzania porzucenia muteksu. Istnieje potencjał, że to może się zdarzyć i dlatego muszę się na to przygotować.

W testowaniu porzuciłem mutex i, na pewno, gdy użyję scoped_lock do zablokowania muteksu, proces blokuje się w nieskończoność. Pomyślałem sobie, że można to zrobić za pomocą mechanizmu limitu czasu na scoped_lock (ponieważ wiele czasu spędziłem w Google na metody rozliczania się z tego, tak naprawdę nie pokazują zbyt wiele, zwiększenie nie ma wiele wspólnego z powodu przenośności).

Bez dalszych ceregieli, oto co mam:

#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");
    }
}

Tak przynajmniej jest. Trzy interesujące punkty:

Kiedy janie użyj obiektu limitu czasu, a mutex zostanie porzucony, blokada ScopedLock blokuje się w nieskończoność. To jest oczekiwane.Kiedy jazgasić limit czasu, a mutex jest porzucony, ctor ScopedLock powraca natychmiast i mówi mi, że nie jest właścicielem muteksu. Ok, może to normalne, ale dlaczego nie czeka na to przez 10 sekund?Kiedy muteksnie jest porzuconyi używam limitu czasu, ctor ScopedLock wciąż powraca natychmiast, mówiąc mi, że nie może zablokować lub przejąć własności muteksu i przechodzę przez ruchy usuwania muteksu i przerabiania go. To wcale nie jest to, czego chcę.

Więc czego brakuje mi przy użyciu tych obiektów? Może patrzy mi w twarz, ale nie widzę tego, więc proszę o pomoc.

Powinienem również wspomnieć, że ze względu na sposób działania tego sprzętu, jeśli proces nie może uzyskać własności muteksu w ciągu 10 sekund, mutex zostaje porzucony. Prawdę mówiąc, mógłbym prawdopodobnie poczekać zaledwie 50 lub 60 milisekund, ale 10 sekund to miła „okrągła” liczba hojności.

Kompiluję na Windows 7 używając Visual Studio 2010.

Dzięki, Andy

questionAnswers(4)

yourAnswerToTheQuestion