2013-08-22 23 views
1

java的synchronized塊就像windows臨界區或互斥鎖一樣:一次只能有一個線程進入它。
但是有一個區別:當你在synchronized塊中調用wait()時,其他線程可以進入塊。不知道如何在winapi中做同樣的事情。winapi模擬java的synchronized/wait()

這不是一個解決方案:

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 

回答

0

根據this tutorial

致電等待同步代碼導致線程放棄其鎖並進入睡眠狀態。這通常會讓另一個線程獲得鎖並繼續進行一些處理。 等待方法沒有使用通知notifyAll毫無意義,它允許等待被通知可以喚醒並繼續執行的代碼。

在Win32 API而言,這將是像這樣的等價物:

等待線程:

ResetEvent(hWaitEvent); 
LeaveCriticalSection(&lock); 
WaitForSingleObject(hWaitEvent, INFINITE); 
EnterCriticalSection(&lock); 

通報主題:

EnterCriticalSection(&lock); 
... 
SetEvent(hWaitEvent); 
LeaveCriticalSection(&lock); 

hWaitEvent是一個可等待事件由CreateEvent()創建。

+0

我有一種感覺,解鎖+睡眠是java原子 – basin

+0

看到更新的問題 – basin

+0

你不應該做ResetEvent,在這種情況下,你需要一個事件,自動重置,以避免競爭。 – nos