• 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;
    }
    
  • 相关阅读:
    Linux 下安装 numpy 和 scipy
    排序算法总结
    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
    Java读取Excel并解析文本(并格式化输出)
    快捷键记忆
    初级应该学习的
    深入理解加密、解密、数字签名和数字证书
    数据签名和验签
    POI结构与常用类
    exlipse继承反编译插件
  • 原文地址:https://www.cnblogs.com/csnd/p/12897027.html
Copyright © 2020-2023  润新知