C++多線程同步技巧(一) --- 臨界區
阿新 • • 發佈:2018-10-01
定義 process i++ 線程 del 文件創建 結構 UNC pau
簡介
C++中關於多線程的內容對於構建工程來說是至關重要的,C++本身也對關於多線程的操作提供了很好的支持。本章筆者就來介紹一下C++有關於多線程的重要知識點---臨界區。
臨界區的作用
線程就像是進程的影子,可以幫助進程幾乎在同一個時間內執行更多的任務。但是由於線程不占有資源,所有的線程共享進程的資源,這樣就導致多個線程在共享進程資源的時候會出現搶奪資源的情況,這些會被搶奪的資源就被稱為是臨界資源,例如打印機資源,文件讀寫,如果出現線程搶占,就會導致輸出混亂。所以我們在進行對臨界資源訪問的時候,我們應該先將要進行的操作進入臨界區,然後在操作完成後退出臨界區,並最後刪除臨界區。
C++代碼樣例
/* *@Author: PeterZ *@Time: 2018/2/14 0:06 *@Function: 線程模擬寫文件,執行完成後輸出完成提示語句 */ #include <cstdio> #include <iostream> #include <cstdlib> #include <cstring> #include <string> #include <Windows.h> using namespace std; #define THREADNUM 5 //定義線程數 #define WRITENUM 100 //定義文件寫入數量 typedef struct ThreadWorkParam { //構造傳參結構體 int i; HANDLE hFile; }Twp; CRITICAL_SECTION g_cs; DWORD WINAPI ThreadWork(LPVOID lpParam) { Twp* p = (Twp*)lpParam; //傳遞結構體參數 DWORD dwWrite; //文件真實寫入字節數 const char *Data = "========>HelloWorld<=========\r\n"; for (int i = 0; i < WRITENUM; i++) { EnterCriticalSection(&g_cs); //進入臨界區 WriteFile(p->hFile, Data, strlen(Data), &dwWrite, NULL); //寫入文件 LeaveCriticalSection(&g_cs); //退出臨界區 } printf("NO.%d Process Run Over !\n", p->i); return 0; } int main(void) { HANDLE hFile = CreateFile("demo.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) //文件創建失敗 { printf("CREATE FILE ERROR >_<..."); } DWORD dwThreadId; //線程統一ID HANDLE hThread[THREADNUM]; Twp TWparam; //實例化待傳參結構體 TWparam.hFile = hFile; InitializeCriticalSection(&g_cs); //初始化臨界區 for (int i = 0; i < THREADNUM; i++) { TWparam.i = i + 1; hThread[i] = CreateThread(NULL, NULL, ThreadWork, LPVOID(&TWparam), 0, &dwThreadId); //創建線程 } WaitForMultipleObjects(5, hThread, true, INFINITE); //等待線程運行結束 DeleteCriticalSection(&g_cs); //刪除臨界區 CloseHandle(hFile); system("pause"); return 0; }
C++多線程同步技巧(一) --- 臨界區