может мьютекс повесить исполнение?

Я довольно новичок в использовании мьютексов серьезно.

После реализации нескольких мьютексов в разных местах я понял, что выполнение программы зависает (не завершается).
Я пытался отладить его (в среде затмения), но не смог найти определенную причину (или, по крайней мере, я не знаю, как ее найти)
Тем не менее, я знаю, что теперь программа зависает, когда пытается выполнить блокировку после нескольких итераций, которая успешно делает блокировку в том же месте.

вот некоторый код:

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-я обменивается мьютексами между классами, которые используются в их методах разными потоками. это обычная практика? это разрешено?

большое спасибо за ваши комментарии и решения

2

Решение

Спасибо всем за ваши добрые комментарии.
Как видите, вопрос широкий, и проблема могла быть вызвана любой из множества указанных вами причин. Для моего случая это было recursive locking это зашло в тупик.

Одним из решений было использование boost::recursive_mutex , Но зачем использовать его, когда я могу выбрать второе решение: во-первых, избегайте рекурсивной блокировки
Это то, что я сделал и, следовательно, проблема решена.

еще раз спасибо

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]