C++多线程同步技巧 --- 临界区

Posted peterz1997

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++多线程同步技巧 --- 临界区相关的知识,希望对你有一定的参考价值。

简介

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<=========
";
    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 !
", 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++多线程同步技巧 --- 临界区的主要内容,如果未能解决你的问题,请参考以下文章

同步互斥的实现

多线程多线程同步_Critical Section临界区

C++并发编程 - 同步并发操作

线程同步(windows平台):临界区

多线程编程之Windows同步方式

多线程相关------临界区CriticalSection