一. 線程安全問題
多線程同時訪問全局變量:一個線程取值後失去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. 一般有幾個資源就定義幾把鎖。