Нужно ли освобождать мьютекс, если он истекает? - PullRequest
4 голосов
/ 31 августа 2011

Использование функции WaitForSingleObject .

Если функция вызывается и время ожидания истекло, нужно ли ей освобождать мьютекс?

т.е. должен ли ReleaseMutex находиться в положении 1. или 2., если прошло пять секунд?

WaitForSingleObject(5 second time out)
{
  //access shared resource

  //1. - ReleaseMutex() here?
}
  //2. - ReleaseMutex() here?

Ответы [ 3 ]

6 голосов
/ 31 августа 2011

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

, т.е. вам нужно только ReleaseMutex в позиции 1.

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

Вам нужно освободить мьютекс, только если вы получили право собственности. Обратите внимание, что существует 4 возможных возвращаемых значения, в 2 случаях вы получаете право собственности, а в 2 - нет.

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

WAIT_OBJECT_0 - вы получили право собственности. Вам нужно освободить мьютекст.

WAIT_TIMEOUT - мьютекст не был выпущен в течение времени ожидания

WAIT_FAILED - обычно из-за ошибки в вашем коде (т. Е. Неверный дескриптор).

2 голосов
/ 31 августа 2011

Ваш случай # 1 верен.Если вы перешли на этот вызов, это означает, что ресурс не был получен, и вы не должны пытаться освободить его.

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