java的synchronized块就像windows critical section或mutex:一次只能有一个线程进入它 但是有一点不同:当你在synchronized块中调用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
答案 0 :(得分:0)
从同步代码中调用等待会导致线程放弃锁定并进入休眠状态。这通常会允许另一个线程获得锁定并继续进行一些处理。如果不使用通知或 notifyAll ,等待方法就毫无意义,它允许等待通知的代码可以唤醒并继续执行。
在Win32 API术语中,这类似于以下内容:
等待线程:
ResetEvent(hWaitEvent);
LeaveCriticalSection(&lock);
WaitForSingleObject(hWaitEvent, INFINITE);
EnterCriticalSection(&lock);
通知线程:
EnterCriticalSection(&lock);
...
SetEvent(hWaitEvent);
LeaveCriticalSection(&lock);
hWaitEvent
是使用CreateEvent()
创建的可等待事件。