Мне это не ясно, может ли кто-нибудь подтвердить это для меня?
У меня следующая проблема с синхронизацией. У меня есть следующие объекты:
A. Process 1, thread 1: Read & write access to the resource.
B. Process 1, thread 2: Read access to the resource.
C. Process 2, thread 3: Read access to the resource.
А вот и условия доступа:
- A должен быть заблокирован, пока B или C включены.
- B должен быть заблокирован только при включенном A.
- C должен быть заблокирован только при включенном A.
Поэтому я подумал использовать для этого 2 именованных мьютекса:
- hMutex2 = используется для выполнения условия 2 выше.
- hMutex3 = используется для выполнения условия 3 выше.
- hStopEvent = событие остановки (необходимо остановить поток, если приложение закрывается).
Итак, для А:
HANDLE hHandles[3] = {hMutex2, hMutex3, hStopEvent};
DWORD dwRes = WaitForMultipleObjects(3, hHandles, FALSE, INFINITE);
if(dwRes == WAIT_OBJECT_0 + 2)
{
//Quit now
return;
}
else if(dwRes == WAIT_OBJECT_0 + 0 ||
dwRes == WAIT_OBJECT_0 + 1)
{
//Do reading & writing here
...
//Release ownership
ReleaseMutex(hMutex2);
ReleaseMutex(hMutex3);
}
else
{
//Error
}
Для Б:
DWORD dwRes = WaitForSingleObject(hMutex2, INFINITE);
if(dwRes == WAIT_OBJECT_0)
{
//Do reading here
...
//Release ownership
ReleaseMutex(hMutex2);
}
else
{
//Error
}
Для С:
DWORD dwRes = WaitForSingleObject(hMutex3, INFINITE);
if(dwRes == WAIT_OBJECT_0)
{
//Do reading here
...
//Release ownership
ReleaseMutex(hMutex3);
}
else
{
//Error
}
Может ли кто-нибудь подтвердить это:
- При вызове WaitForMultipleObjects для обоих мьютексов они оба становятся сигнальными (или блокируются)?
- Также мне нужно освободить оба мьютекса?