pthread_mutex_lock блокирует, но владелец не установлен - PullRequest
5 голосов
/ 14 июля 2011

Я работал над этим в течение нескольких дней -

В качестве фона я работаю над тем, чтобы взять однопоточную программу на C и сделать ее многопоточной. Недавно я обнаружил новый случай тупика, но когда я смотрю на мьютекс в gdb, я вижу, что

__ lock = 2 еще __owner = 0

Это не рекурсивный мьютекс. Кто-нибудь видел это? Программа, над которой я работаю, является демоном, и этот случай происходит только после выполнения с высокой пропускной способностью в течение более 20 минут (приблизительно) и затем ослабления нагрузки. Если у вас есть идеи, я был бы признателен.

Редактировать - я забыл упомянуть, что все мои другие темы в это время простаивают.

Приветствия

Ответы [ 3 ]

5 голосов
/ 14 июля 2011

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

Взаимная блокировка, с которой вы сталкиваетесь, почти наверняка вызвана тем, что поток пытается заблокировать мьютекс, который он уже удерживает, или фактической логической ошибкой, когда каждый из двух или более потоков ожидает мьютексы, которые удерживает другой.

1 голос
/ 14 февраля 2013

Я только что исправил проблему, которая у меня возникла - повреждение стека привело к тому, что значение mutex.__data.__lock было установлено на какое-то нелепое число (4 миллиарда раз) перед попыткой вызова pthread_mutex_lock. Посмотрите, можете ли вы установить точку останова или напечатать информацию об отладке со значением __lock непосредственно перед выполнением операции блокировки, и я готов поспорить, что она недействительна до того, как возникнет взаимоблокировка.

1 голос
/ 18 декабря 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...