私はこれについてはっきりしていません、誰かが私のためにこれを確認できますか?
次の同期の問題があります。次のオブジェクトがあります。
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.
そして、アクセス条件は次のとおりです。
- B または C がオンの間は、A をブロックする必要があります。
- B は、A がオンの間だけブロックする必要があります。
- C は、A がオンの間のみブロックする必要があります。
そのため、2 つの名前付きミューテックスを使用することを考えました。
- hMutex2 = 上記の条件 2 を満たすために使用されます。
- hMutex3 = 上記の条件 3 を満たすために使用されます。
- hStopEvent = 停止イベント (アプリが閉じている場合はスレッドを停止する必要があります)。
Aの場合:
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
}
B の場合:
DWORD dwRes = WaitForSingleObject(hMutex2, INFINITE);
if(dwRes == WAIT_OBJECT_0)
{
//Do reading here
...
//Release ownership
ReleaseMutex(hMutex2);
}
else
{
//Error
}
C の場合:
DWORD dwRes = WaitForSingleObject(hMutex3, INFINITE);
if(dwRes == WAIT_OBJECT_0)
{
//Do reading here
...
//Release ownership
ReleaseMutex(hMutex3);
}
else
{
//Error
}
誰かがこれを確認できますか:
- 両方のミューテックスで WaitForMultipleObjects を呼び出すと、両方ともシグナル状態 (またはブロック) になりますか?
- また、両方のミューテックスを解放する必要がありますか?