Helgrind жалуется, что ваши потоки блокируют мьютексы m1
и m2
в разных относительных порядках, что также ясно из проверки кода. Helgrind ищет и отмечает такие различия в порядке получения, потому что, вообще говоря, они создают риск тупиковой ситуации.
Я думаю, что внешняя блокировка g
не позволит двум потокам войти в критическую секцию на то же время. Только один поток может получить блокировку g
в данный момент. Поэтому я считаю, что тупиковой ситуации быть не может. Я что носил?
Вы не ошиблись. Представленная конкретная программа не будет тупиковой, потому что каждый поток должен получить g
, прежде чем он сможет получить любой из других мьютексов.
Почему helgrind выдает эту ошибку?
Потому что helgrind - это heuristi c анализ поведения вашей программы во время одного запуска . Он не предполагает, что один запуск программы демонстрирует все возможные варианты поведения. С другой стороны, ваша оценка основана на анализе исходного кода.
Правило эвристики c, которое вы видите в действии, заключается в том, что никакие пары мьютексов не должны приобретаться в разных относительных порядках ни одним потоком. . Для вашей конкретной программы это приводит к ложному срабатыванию, но ваша программа кажется специально разработанной для его создания. Во-первых, нет необходимости в мьютексах m1
и m2
, если мьютекс g
всегда будет удерживаться при захвате любого из остальных. Однако, если бы любой другой поток мог получить m1
и m2
, не удерживая g
, то риск взаимоблокировки был бы реальным, независимо от порядка получения в указанном другом потоке.
В любом случае Таким образом, предупреждение сигнализирует о реальной проблеме с вашим кодом: либо вы выполняете ненужные операции мьютекса, либо у вас есть реальный настоящий или будущий риск взаимоблокировки.