java的同步块类似于windows临界区或互斥:一次只能有一个线程进入它。
但有一个区别:当您在synchronized块内调用wait()时,其他线程获得进入该块的能力。不确定如何在winapi中做同样的事情。
这不是一个解决方案:
LeaveCriticalSection();
// Something important may happen between these calls
WaitForSingleObject();Java:
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发布于 2013-08-22 16:54:34
根据this tutorial的说法
从同步的代码中调用wait会导致线程放弃其锁并进入睡眠状态。这通常会允许另一个线程获得锁并继续一些处理。
在Win32应用程序接口术语中,这相当于如下所示:
等待线程:
ResetEvent(hWaitEvent);
LeaveCriticalSection(&lock);
WaitForSingleObject(hWaitEvent, INFINITE);
EnterCriticalSection(&lock);通知线程:
EnterCriticalSection(&lock);
...
SetEvent(hWaitEvent);
LeaveCriticalSection(&lock);其中,hWaitEvent是使用CreateEvent()创建的可等待事件。
https://stackoverflow.com/questions/18375316
复制相似问题