2011-04-09 199 views
7

只是想澄清一點。 想象一下,我使用EnterCriticalSection的窗口API。我稱他們都與EnterCriticalSection(&criticalsection);什麼是關鍵部分?

這是線程函數是多線程

void thread(){ 

//enter critical section (part 1) 
data 
//leave critical section 
///more data 1 
//entercritical section (part 2) 
//more data 2 
//leave critical section 

} 

一旦線程進入臨界(第1部分),其他線程不能不管輸入是否更多的數據1的該部分實際上有任何共享數據或不正確?同樣在此期間,其他線程也不能進入關鍵部分的第2部分。

+0

漢斯 - 不正確。 Jake詢問CriticalSection1中的進程是否會鎖定CS1和CS2。這是錯誤的 - 關鍵部分是獨立的。傑克,如果你想讓CS1同時鎖定,你可以在CS1中嵌套CS2。 – Greg 2012-08-17 13:30:12

回答

8

關鍵部分是代碼塊。如果有任何線程輸入,則其他線程在進入空閒狀態之前不能進入。如果1和2是不同的關鍵部分(即由不同的信號量處理),如果1被佔用,則某人可以輸入2。

3

規則很簡單:只有一個線程可以在特定臨界區內執行代碼(在同一實例上對EnterCriticalSectionLeaveCriticalSection的調用之間執行的代碼的任何部分)。從操作系統的角度來看,像代碼的一部分,功能在這裏是無關緊要的。唯一重要的是調用上述例程的次數。每當某種情況發生時,某個線程在特定臨界區域對象上調用EnterCriticalSection多於LeaveCriticalSection時,就說它是「在該臨界區域內」。

也就是說,您可以創建多個關鍵部分並獨立執行。所以一個關鍵部分永遠不會影響另一個關鍵部分。使用對構造函數的不同調用創建不同的關鍵部分。

2

看到這個:

考慮一個變量

int k 

兩個線程都在K的這種說法

k+=100; 

現在假設k等於0。第一個線程開始讀取操作k,找到k = 0,然後將k加100.然後第二個線程在第一個線程寫回k = 100之前開始讀取k。然後第二個線程將假設k = 0並將其加上100,最後在兩個線程加入k = 100之後,預計不會出現200.這就是我們將k+=100設置爲關鍵部分的原因。