06 臨界區
阿新 • • 發佈:2018-12-15
1 執行緒安全問題
每個執行緒都有自己的棧,而區域性變數是在棧中的,這就意味著每個執行緒都有一份自己的區域性變數, 如果執行緒只使用區域性變數,那就不存線上程安全問題;如果多執行緒訪問全域性變數,則存在安全問題;
2.臨界資源
一次只允許一個執行緒使用的資源我們將它叫做臨界資源;
3.臨界區
訪問臨界資源的那段程式我們稱為臨界區;
4.簡單的臨界區使用示例
/** *CreateThread.c */ #include <stdio.h> #include <windows.h> INT g_dwTickets = 10; CRITICAL_SECTION cs; //執行緒處理函式,引數與返回值不是必須的; DWORD WINAPI ThreadProc(LPVOID lpThreadParameter) { if (g_dwTickets > 0){ //進入臨界區 EnterCriticalSection(&cs); while (g_dwTickets > 0){ printf("還有:%d張票\n", g_dwTickets); g_dwTickets--; printf("賣出一張,還有:%d張\n", g_dwTickets); } //離開臨界區 LeaveCriticalSection(&cs); } return 0; } int main() { HANDLE hThreadArr[2]; INT n = 10; //初始化臨界區 InitializeCriticalSection(&cs); hThreadArr[0] = CreateThread(NULL, 0, ThreadProc, &n, 0, NULL); hThreadArr[1] = CreateThread(NULL, 0, ThreadProc, &n, 0, NULL); //等待多個物件,第一個引數為個數,第二個為控制代碼陣列,狀態標誌等 //待一個還是所有,最後一個引數為超時時間 WaitForMultipleObjects(2, hThreadArr, TRUE, INFINITE); CloseHandle(hThreadArr[0]); CloseHandle(hThreadArr[1]); getchar(); return 0; }