Я довольно новичок в использовании мьютексов серьезно.
После реализации нескольких мьютексов в разных местах я понял, что выполнение программы зависает (не завершается).
Я пытался отладить его (в среде затмения), но не смог найти определенную причину (или, по крайней мере, я не знаю, как ее найти)
Тем не менее, я знаю, что теперь программа зависает, когда пытается выполнить блокировку после нескольких итераций, которая успешно делает блокировку в том же месте.
вот некоторый код:
void xxx::receiveModule(timeslice now)
{
//check if you have received anything in the incoming buffer
if(!isIncomingDirty())// <- has a mutex inside
{
return;
}
//...
}bool &yyy::isIncomingDirty() {
boost::unique_lock< boost::shared_mutex > lock(*Communicator_Mutexes[2]));//<-this will cause hang after a few calls
return incomingIsDirty;
}
Я не знаю, как поведет себя тупик, когда это произойдет.
1-это тупик?
2-где бы вы проверить, чтобы найти причину?
3-может ли рекурсивная блокировка или вложенная блокировка одного и того же мьютекса вызвать такую ситуацию?
и этот может быть не по теме:
4-я обменивается мьютексами между классами, которые используются в их методах разными потоками. это обычная практика? это разрешено?
большое спасибо за ваши комментарии и решения
Спасибо всем за ваши добрые комментарии.
Как видите, вопрос широкий, и проблема могла быть вызвана любой из множества указанных вами причин. Для моего случая это было recursive locking
это зашло в тупик.
Одним из решений было использование boost::recursive_mutex
, Но зачем использовать его, когда я могу выбрать второе решение: во-первых, избегайте рекурсивной блокировки
Это то, что я сделал и, следовательно, проблема решена.
еще раз спасибо
Других решений пока нет …