zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    用Visual Studio2010 编译 C++文件"hello world”
    hdu 1010 Tempter of the Bone(dfs+奇偶剪枝)
    最长子串(动态规划)
    C++中,访问字符串的三种方法
    POJ3260:The Fewest Coins(混合背包)
    如何做好基层技术管理工作?
    UVa10651(记忆化搜索)
    <Win32_5>深入浅出Win32的计时器
    【转载】一步一步写算法(之hash表)
    C可变参数函数 实现
  • 原文地址:https://www.cnblogs.com/csnd/p/12897027.html
Copyright © 2011-2022 走看看