事件可有人請解釋什麼區別,如果我做互斥VS在Windows
mutex = createMutex
waitForSingleObject
Release(mutex)
和
event = createEvent
waitForSingleObject
Release(event)
我很困惑,我可以使用兩個版本的同步?在此先感謝您的幫助
事件可有人請解釋什麼區別,如果我做互斥VS在Windows
mutex = createMutex
waitForSingleObject
Release(mutex)
和
event = createEvent
waitForSingleObject
Release(event)
我很困惑,我可以使用兩個版本的同步?在此先感謝您的幫助
您使用一個互斥鎖來確保只有一個執行線程可以訪問某個東西。例如,如果你想更新有可能被多個線程使用的名單,你會使用一個互斥體:
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
是的,兩者都可用於同步,但方式不同。
互斥鎖是互斥對象,一次只能由一個實例獲取。它用於避免同時使用公共資源(如全局變量),通過多個計算機代碼
事件是一個可以通過使用SetEvent函數明確設置爲狀態的對象。
你是什麼意思「一鏟頭」?可以通過多個實例獲取事件嗎?互斥量也可以發信號如果我做waitForSingleObject,我錯了嗎? – yeap
是的,實際上任何同步對象都可以在WaitForSingleObject/WaitForMultipleObject中使用。差異在於他的行爲。 – cprogrammer
事件不像互斥體或臨界區被獲取那樣獲取。發生事件時可以發出事件信號。 – cprogrammer
互斥體的初始值是什麼:發信號或未發信號? – yeap
@yeap:在幾乎所有的情況下,包括這個,你都想創建互斥鎖,以便它最初不被獲取。 –
一個重要的區別是互斥鎖可以被同一個線程重複鎖定(這是「遞歸」),而事件可以用來實現非遞歸鎖定。 –