2011-08-02 109 views
11

事件可有人請解釋什麼區別,如果我做互斥VS在Windows

mutex = createMutex 
waitForSingleObject 
Release(mutex) 

event = createEvent 
waitForSingleObject 
Release(event) 

我很困惑,我可以使用兩個版本的同步?在此先感謝您的幫助

回答

12

您使用一個互斥鎖來確保只有一個執行線程可以訪問某個東西。例如,如果你想更新有可能被多個線程使用的名單,你會使用一個互斥體:

acquire mutex 
update list 
release mutex 

用互斥鎖,在同一時間只有一個線程可以執行「更新列表」。

如果您希望多個線程在繼續之前等待某些事情發生,則使用手動重置事件。例如,您啓動了多個線程,但在它們可以繼續之前它們都已暫停等待其他事件。一旦發生該事件,所有線程都可以開始運行。

主線程應該是這樣的:

create event, initial value false (not signaled) 
start threads 
do some other initialization 
signal event 

每個線程的代碼如下:

do thread initialization 
wait for event to be signaled 
do thread processing 
+0

互斥體的初始值是什麼:發信號或未發信號? – yeap

+0

@yeap:在幾乎所有的情況下,包括這個,你都想創建互斥鎖,以便它最初不被獲取。 –

+1

一個重要的區別是互斥鎖可以被同一個線程重複鎖定(這是「遞歸」),而事件可以用來實現非遞歸鎖定。 –

1

是的,兩者都可用於同步,但方式不同。

互斥鎖是互斥對象,一次只能由一個實例獲取。它用於避免同時使用公共資源(如全局變量),通過多個計算機代碼

事件是一個可以通過使用SetEvent函數明確設置爲狀態的對象。

+0

你是什麼意思「一鏟頭」?可以通過多個實例獲取事件嗎?互斥量也可以發信號如果我做waitForSingleObject,我錯了嗎? – yeap

+0

是的,實際上任何同步對象都可以在WaitForSingleObject/WaitForMultipleObject中使用。差異在於他的行爲。 – cprogrammer

+0

事件不像互斥體或臨界區被獲取那樣獲取。發生事件時可以發出事件信號。 – cprogrammer