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<=========\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;
}

posted @ 2018-10-01 18:18  倚剑问天  阅读(1355)  评论(0编辑  收藏  举报