У меня есть необходимость в межпроцессной синхронизации вокруг части оборудования. Поскольку этот код нужно будет работать в Windows и Linux, я обертываю мутетексом Boost Interprocess. Все хорошо работает с моим методом проверки отказа от мьютекса. Существует вероятность того, что это может произойти, и поэтому я должен подготовиться к этому.Ускорение взаимных взаимных мьютексов и проверка на отказ
Я отказался от мьютекса в своих тестах и, конечно же, когда я использую scoped_lock для блокировки мьютекса, процесс блокируется бесконечно. Я понял, что это связано с использованием механизма тайм-аута на scoped_lock (так как много времени, потраченное на Googling для методов учета этого, на самом деле не очень много, повышение не сильно обошлось этому из-за соображений мобильности).
Без дальнейших церемоний, вот что у меня есть:
#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");
}
}
Это, по крайней мере, это идея. Три интересных момента:
- Когда я не использовать объект тайм-аут, и мьютекс брошено, ScopedLock CTOR блоки на неопределенное время. Это ожидалось.
- Когда я действительно использую тайм-аут, а мьютекс заброшен, ScopedLock ctor немедленно возвращается и сообщает мне, что он не имеет мьютекса. Хорошо, возможно, это нормально, но почему он не ждет 10 секунд, о которых я тоже рассказываю?
- Когда мьютекс не заброшен, и я использую таймаут, ScopedLock ctor все равно возвращается немедленно, сообщая мне, что он не может заблокировать или взять на себя ответственность за мьютекс, и я прохожу через движения по удалению мьютекс и переделку. Это совсем не то, что я хочу.
Итак, что мне не хватает при использовании этих объектов? Возможно, это смотрит мне в лицо, но я не вижу этого, и поэтому я прошу помощи.
Следует также упомянуть, что из-за того, как это аппаратное обеспечение работает, если процесс не может получить право собственности на мьютекс в течение 10 секунд, мьютекс заброшен. Фактически, я, вероятно, мог бы подождать всего 50 или 60 миллисекунд, но 10 секунд - это хорошее «круглое» количество щедрости.
Я компиляции на Windows 7 с помощью Visual Studio 2010.
Спасибо, Энди
Не относится к вашему вопросу, но 'reinterpret_cast' s в вашем примере не нужны (не знаю, почему они там). –
@GaborMarton Я думаю, что правильно использую функцию remove(). Проверьте код еще раз. Я удаляю указатель, который, я согласен, не удаляет мьютекс, но тогда я вызываю boost :: interprocess :: named_recursive_mutex :: remove ("MyMutex"). Если я неправильно его использовал, пожалуйста, поправьте меня. Спасибо –
Да, вы правы, просто удалили мой комментарий и обновили мой ответ. Надеюсь, это поможет. –