В качестве текущего заголовка сообщения, говорящего об этом, boost boost :: interprocess :: interprocess_condition :: wait предполагает атомарную разблокировку мьютекса, пока он ждет , но это не так.boost :: interprocess :: interprocess_condition :: wait не атомирует разблокировку мьютекса во время ожидания
В следующем коде:
boost::interprocess::scoped_lock<boost::interprocess::interprocess_mutex> state_access_lock(impl->state->state_access_mut);
impl->state->state_access_cond.wait(state_access_lock);
В VS2010 в режиме отладки, я нажал паузу и был удивлен, когда я увидел, что state_access_lock все еще заблокирован во время ожидания.
Но это не то, что сообщает boost. here.
Есть ли у кого-нибудь предложение?
Спасибо.
Есть ли у вас фактическое наблюдение за поведением кода или просто значением некоторой переменной в отладчике? –
Я понял это в первую очередь. Потому что мой второй поток, который должен был писать, затем вызывать уведомление, ждал, когда мьютекс будет выпущен вечно. Только после этого я решил проверить, что происходит с моим мьютексом, в первый поток, используя режим отладки VS. –
Кроме того, очень маловероятно, что такая фундаментальная неисправность осталась бы незамеченной, каждая отдельная кодировка различных переменных условия (кстати, вы должны указать, какой из них вы используете) проходит через разблокировку блокировки мьютекса. Таким образом, ошибка должна быть где-то в другом месте. Попробуйте опубликовать больше контекста. –