简介

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

最新文章

  1. 全基因组关联分析(Genome-Wide Association Study,GWAS)流程
  2. JQ分页功能
  3. ubuntu 安装Firefox 29.0
  4. 写在Python前
  5. SharePoint 2010 文档管理系列之星级评论功能
  6. codeforces 715B:Complete The Graph
  7. 1006 最长公共子序列Lcs
  8. 201521123009《Java程序设计》第3周学习总结
  9. Netty对Protocol Buffer多协议的支持(八)
  10. 在IAR下移植CC2650 contiki工程
  11. STL空间配置器、vector、list、deque、map复习
  12. 【Paywave】VISA Paywave - ICS category selection
  13. Linux驱动之触摸屏程序编写
  14. Kettle转换工具Windows版安装
  15. Linux 搭建Hadoop集群 成功
  16. CF113D 高斯消元、dp
  17. List&lt;Map&lt;String, String&gt;&gt;和Map&lt;String, List&lt;String&gt;&gt;遍历
  18. django初体验 学习笔记
  19. mongodb的远程访问
  20. 日期/时间处理工具 DateTimeUtil

热门文章

  1. Java——对象比较
  2. 第7章 Linux上配置RAID
  3. tcp_wrapper过滤
  4. 20.Module 的语法
  5. redis的Pub/Sub
  6. [转]virtualBox实现主机和虚拟机相互ping通,配置静态IP地址
  7. vb.net 與 SQLite連線
  8. [android] 保存文件到手机内存
  9. springMVC_08文件上传
  10. (6)Microsoft office Word 2013版本操作入门_文件封面,页首,页尾