Мьютекс может повесить исполнение?
Я довольно новичок в использовании мьютексов серьезно.
После реализации нескольких мьютексов в разных местах я понял, что выполнение программы зависает (не завершается). Я попытался отладить его (в среде затмения), но не смог найти определенную причину (или, по крайней мере, я не знаю, как ее найти). Однако теперь я знаю, что программа зависает, когда пытается выполнить блокировку после несколько итераций, которые успешно блокируют одно и то же место.
вот некоторый код:
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-я обменивается мьютексами между классами, которые используются в их методах разными потоками. это обычная практика? это разрешено?
большое спасибо за ваши комментарии и решения
1 ответ
Спасибо всем за ваши добрые комментарии. Как видите, вопрос широкий, и проблема могла быть вызвана любой из множества указанных вами причин. Для моего случая это было recursive locking
это зашло в тупик.
Одним из решений было использование boost::recursive_mutex
, Но зачем использовать его, когда я могу выбрать второе решение: во-первых, избегать рекурсивной блокировки
Это то, что я сделал, и, следовательно, проблема решена.
еще раз спасибо