Я новичок в серьезном использовании мьютексов.
После реализации нескольких мьютексов в разных местах я понял, что выполнение программы зависает (не завершается). Я попытался отладить его (в среде eclipse), но я не смог найти определенную причину (или, по крайней мере, я не знаю, как ее найти). Однако теперь я знаю, что программа зависает, когда она пытается сделать блокировку после несколько итераций, которые успешно блокируют одно и то же место.
вот код:
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-я обмениваюсь мьютексами между классами, которые будут использоваться в их методах разными потоками. это обычная практика? такое разрешено?
большое спасибо за ваши комментарии и решения
Communicator_Mutexes[2]
? Если да, то это листовая блокировка (операторreturn
впоследствии ничего не блокирует), а не причина взаимоблокировок. - person MSalters   schedule 16.04.2013