Window線程安全

一. 線程安全問題

多線程同時訪問全局變量:一個線程取值後失去CPU另一個線程取值後也失去CPU,此時它們保存的就是相同的值。也是是說,比如兩個線程再次對全區變量做++操作時變量只會被修改爲同樣的值。

 

二. 臨界區(線程鎖)

臨界區:Critical Section (Critical:臨界的、關鍵的)

1、創建CRITICAL_SECTION:            

CRITICAL_SECTION cs;            
            
2、在使用前進行初始化            

InitializeCriticalSection(&cs);            
            
            
3、在函數中使用:            
            
DWORD WINAPI 線程A(PVOID pvParam) {            
      EnterCriticalSection(&cs);                        
      //對全局遍歷X的操作            
      LeaveCriticalSection(&cs);            
      return(0);            
}            
DWORD WINAPI 線程B(PVOID pvParam) {            
      EnterCriticalSection(&g_cs); 
      //對全局遍歷X的操作      
      LeaveCriticalSection(&g_cs);            
      return(0);            
}            
            
4、刪除CRITICAL_SECTION            

VOID DeleteCriticalSection(PCRITICAL_SECTION pcs);            

 

臨界區結構體:

typedef struct _RTL_CRITICAL_SECTION {        
    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;        
    LONG LockCount;        
    LONG RecursionCount;        
    HANDLE OwningThread;    
          
    HANDLE LockSemaphore;        
    DWORD SpinCount;        
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;        
        
LockCount:
它被初始化爲數值 -1        
此數值等於或大於 0 時,表示此臨界區被佔用        
        
等待獲得臨界區的線程數:LockCount - (RecursionCount -1)        
        
RecursionCount:
此字段包含所有者線程已經獲得該臨界區的次數        
        
OwningThread:
此字段包含當前佔用此臨界區的線程的線程標識符        
此線程 ID 與GetCurrentThreadId 所返回的 ID 相同        
 

注意:

1. 只對可能產生安全問題的最小單元進行加鎖,否則會降低運行效率。

2. 一般有幾個資源就定義幾把鎖。

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章