Java の同期ブロックは、Windows のクリティカル セクションまたはミューテックスに似ています。一度に 1 つのスレッドしか入ることができません。
ただし、違いがあります。同期ブロック内で wait() を呼び出すと、他のスレッドがブロックに入ることができるようになります。winapi で同じことを行う方法がわかりません。
これは解決策ではありません:
LeaveCriticalSection();
// Something important may happen between these calls
WaitForSingleObject();
ジャワ:
Thread 1 Thread 2 Thread 3
1
2 synchronized {
3 wait
5 synchronized {
6 notifyAll
7 }
4 }
8 synchronized {
9 wait
10 }
11 continue not continue
レミーの変種:
Thread 1 Thread 2 Thread 3
1 EnterCriticalSection
2 ResetEvent
3 LeaveCriticalSection
4 EnterCriticalSection
5 SetEvent
6 LeaveCriticalSection
7 EnterCriticalSection
8 ResetEvent
9 LeaveCriticalSection
10 WaitForSingleObject WaitForSingleObject
11 not continue not continue