1. 程式人生 > >C++多線程同步技巧(一) --- 臨界區

C++多線程同步技巧(一) --- 臨界區

定義 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++多線程同步技巧(一) --- 臨界區