2012-08-02 97 views
3

這是我的代碼的一小部分:EnterCriticalSection的犯規鎖定

CRITICAL_SECTION _cs; 
InitializeCriticalSection(&_cs); 

void lock() { 
    if (_initizalized){ 
     EnterCriticalSection(&_cs); 
     EnterCriticalSection(&_cs); 
     _locked = true; 
    } 
    } 

(我寫「EnterCriticalSection的」兩次,因爲我注意到,這條線不工作) 據我瞭解,這必須引起僵局。但事實並非如此。爲什麼?

回答

9

沒有相同的線程可以根據需要經常輸入它。 CRITICAL_SECTION用於限制多個不同線程之間的訪問。

7

EnterCriticalSection允許來自同一個線程的遞歸調用。從文檔:

後一個線程都有一個關鍵部分的所有權,它可以對EnterCriticalSection的或TryEnterCriticalSection 額外 通話無阻塞執行。這可以防止 線程在等待它已經擁有的關鍵部分時自己發生死鎖。線程每次進入關鍵部分 EnterCriticalSection和TryEnterCriticalSection成功。線程 每次進入 關鍵部分時都必須調用LeaveCriticalSection一次。

3

由於MSDN says

後一個線程都有一個關鍵部分的所有權,它可以對EnterCriticalSection的或TryEnterCriticalSection額外調用不會阻塞其執行。這可以防止線程在等待它已經擁有的關鍵部分時發生死鎖。每次EnterCriticalSection和TryEnterCriticalSection成功時,線程都會進入臨界區。線程每次進入關鍵部分時都必須調用LeaveCriticalSection一次。