Когда я не использую объект тайм-аута, а мьютекс заброшен, ScopedLock ctor блокирует бесконечно. Ожидается
blockquote>. Лучшим решением для вашей проблемы было бы, если бы boost поддерживал надежные мьютексы. Однако Boost в настоящее время не поддерживает надежные мьютексы. Существует только план эмуляции надежных мьютексов, потому что только linux имеет встроенную поддержку. Эмуляция еще только планировалась автором книги Ион Газтанага. Проверьте эту ссылку о возможном взломе мьютексов rubust в boost libs: http://boost.2283326.n4.nabble.com/boost-interprocess-gt-1-45-robust-mutexes-td3416151.html
Между тем вы можете попытаться использовать атомные переменные в общем сегменте.
Также посмотрите на эту запись stackoverflow: Как я могу взять на себя ответственность за покинутый boost :: interprocess :: interprocess_mutex?
Когда я использую тайм-аут, а мьютекс заброшен, ScopedLock ctor немедленно возвращается и сообщает мне, что он не владеет мьютекс. Хорошо, возможно, это нормально, но почему он не ждет 10 секунд, о которых я тоже рассказываю?
blockquote>Это очень странно, вы не должны получать это поведение. Тем не менее: временная блокировка, возможно, реализована с точки зрения блокировки try. Проверьте эту документацию: http://www.boost.org/doc/libs/1_53_0/doc/html/boost/interprocess/scoped_lock.html#idp57421760-bb Это означает, что реализация lock может вызывать исключение изнутри и затем возвращает false.
inline bool windows_mutex::timed_lock(const boost::posix_time::ptime &abs_time) { sync_handles &handles = windows_intermodule_singleton
::get(); //This can throw winapi_mutex_functions mut(handles.obtain_mutex(this->id_)); return mut.timed_lock(abs_time); } Возможно, дескриптор не может быть получен, поскольку мьютекс заброшен.
Когда мьютекс isn ' t отказался, и я использую таймаут, ScopedLock ctor все равно возвращается немедленно, сообщая мне, что он не может заблокировать или взять на себя ответственность за мьютекс, и я прохожу движение от удаления мьютекса и его переделку. Это совсем не то, что я хочу.
blockquote>Я не уверен в этом, но я думаю, что именованный мьютекс реализован с использованием общей памяти. Если вы используете Linux, проверьте файл / dev / shm / MutexName. В Linux дескриптор файла остается действительным до тех пор, пока он не будет закрыт, независимо от того, удалил ли вы сам файл, например. повышение :: межпроцессного :: named_recursive_mutex :: удалить.