2010-05-11 83 views
12

關於互斥區和臨界區之間的區別存在一個問題,但它也不涉及鎖。鎖,互斥和臨界區之間的區別

所以我想知道關鍵部分是否可用於進程之間的線程同步。

而且什麼是信號狀態和無信號狀態

+2

他們對我來說是一樣的,我的猜測是你正在使用一個庫,這使得三者之間有所不同(Win32?)。 – 2010-05-11 06:56:39

+0

你是說像CSingleLock這樣的鎖在線程跨進程時也支持線程同步。我認爲只有Mutex支持。如果我錯了,請糾正我的錯誤 – ckv 2010-05-11 06:59:43

回答

7

在Windows臨界區(大部分)是在用戶模式下實現的,而互斥量會將上下文切換到內核模式(這很慢)。如果一個線程在擁有一個互斥體時終止,那麼互斥體就被認爲是被放棄了。互斥狀態設置爲發信號,下一個等待線程獲得所有權。在臨界區域的情況下,所有其他線程將保持阻塞狀態。關鍵部分無法命名,因此您無法使用它們來同步多個進程。

+0

「關鍵部分完全在用戶模式下實現」< - 並非完全如此。如果他們有足夠的時間旋轉,關鍵部分會產生而不是旋轉。 – 2011-03-01 18:11:37

2

CriticalSections意思是過程。被稱爲互斥鎖可以跨進程使用

鎖是一個通用術語,因此我不知道你的意思是哪個平臺。例如在C#中,一個鎖原語是一個關鍵部分。

+0

並且鎖也處於正確的狀態? – ckv 2010-05-11 07:02:28

2

1)臨界區是用戶和聯鎖操作之間的橋樑。它使用inetrlocked交換的操作來鎖定和解鎖你的線程。它的工作速度比互斥鎖快。

2)互斥鎖是一個內核對象。它工作不快,但有一些優點。首先,可以跨進程使用已命名的互斥鎖。其次,如果線程被終止,那麼由該線程鎖定的互斥鎖被解鎖。

3

關鍵部分不是內核對象。他們沒有與任何句柄標識。它們只能用於同步屬於同一進程的線程。它們不能在整個過程中用於同步。

CSingleLock(我假設你是指這是一個鎖,在這種情況下)是一個使用RAII概念的包裝類。它可以幫助您獲取線程同步對象(在其構造函數中),並以簡單的方式調用鎖定和解鎖API。 (隱藏它使用的同步對象的所有內部細節)。

CSingleLock與Critical部分一起使用時,不能跨進程使用。互斥體可以用於此目的。

當線程獲取互斥鎖並且沒有其他線程可以獲取互斥鎖時,則說互斥鎖的狀態處於非鎖定狀態。 如果互斥鎖可用且沒有線程獲取,則它處於Signeled狀態。