Если у меня есть следующий код C ++ (для Windows Os):
HANDLE hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
HANDLE hMutex = ::CreateMutex(NULL, FALSE, NULL);
HANDLE hHandles[] = {
hEvent,
hMutex
};
DWORD dwR = ::WaitForMultipleObjects(2, hHandles, FALSE, INFINITE) - WAIT_OBJECT_0;
//if dwR == 0, what state is hMutex in?
//Or, do I need to call ReleaseMutex(hMutex) in that case?
Я не уверен, как справиться с этой ситуацией в отношении мьютекса.
dwR
не совсем ноль, это WAIT_OBJECT_0 + 0
То есть ваше ожидание было удовлетворено по первой предоставленной ручке. Это дескриптор события, поэтому вам не нужно прикасаться к своему мьютексу.
Если результат WAIT_OBJECT_0 + 1
тогда это была мьютексная ручка, используемая, чтобы преуспеть в ожидании. И как только вы закончите с тем, что вам нужно сделать, вы освобождаете право собственности по телефону ReleaseMutex
,
Функция работает как метод WaitForSingleObject для мьютексов. Есть пример в MSDN (Пример MSDN), который иллюстрирует получение Mutex с WaitForSingleObject. WaitForMultipleObjects имеет такое же поведение при использовании Mutex.