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

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

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

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

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, Но зачем использовать его, когда я могу выбрать второе решение: во-первых, избегать рекурсивной блокировки
Это то, что я сделал, и, следовательно, проблема решена.

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

Другие вопросы по тегам