Как вы справляетесь со сбоями pthread_mutex_unlock? - PullRequest
8 голосов
/ 15 сентября 2011

Предполагая, что поток успешно вызывает pthread_mutex_lock, все еще возможно, что вызов pthread_mutex_unlock в том же потоке завершится неудачей? Если да, можете ли вы что-то с этим сделать, кроме прерывания потока?

if(pthread_mutex_lock(&m) == 0)
{
   // got the lock, let's do some work

   if(pthread_mutex_unlock(&m) != 0) // can this really fail?
   {
      // ok, we have a lock but can't unlock it?
   }
}

С этой страницы , возможные ошибки для pthread_mutex_unlock():

[EINVAL] Значение, указанное мьютексом, не относится к инициализированному объект мьютекса.

Если блокировка прошла успешно, это вряд ли даст сбой.

[EAGAIN] Мьютекс не может быть получен, потому что максимальное количество Рекурсивные блокировки для мьютекса были превышены.

В самом деле? Для разблокировки?

Функция pthread_mutex_unlock () может завершиться ошибкой, если:

[EPERM] Текущему потоку не принадлежит мьютекс.

Опять же, если блокировка прошла успешно, этого также не должно происходить.

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

Ответы [ 2 ]

3 голосов
/ 30 сентября 2011

Ну, прежде чем плакать "победа".Я оказался на этой странице в поисках причины, по которой одна из моих программ перестала работать на pthread_mutex_unlock (на HP-UX, а не на Linux).

if (pthread_mutex_unlock(&mutex) != 0)
   throw YpException("unlock %s failed: %s", what.c_str(), strerror(errno));

Это не помогло мне после многих миллионов счастливых казней,errno был EINTR, хотя я только что узнал, что я должен проверять не errno, а возвращаемое значение.Но, тем не менее, возвращаемое значение было НЕ 0. И я могу математически доказать, что в этом месте у меня есть действительная блокировка.

Итак, давайте просто скажем, что ваша теория находится в состоянии стресса, хотя требуется больше исследований ;-)

2 голосов
/ 15 сентября 2011

со страницы руководства для pthread_mutex_unlock:

The pthread_mutex_unlock() function may fail if:

EPERM
The current thread does not own the mutex.

These functions shall not return an error code of [EINTR].

Если вы верите справочной странице, может показаться, что ваша ошибка не может произойти.

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