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;
}
C++多线程同步技巧(一) --- 临界区的更多相关文章
- 多线程(四)多线程同步_Critical Section临界区
临界区是指一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权.和使用mutex一样,它们都是以原子操作方式来对共享资源进行访问. 临界区又叫关键代码段,与上一篇的mutex互斥体实现的功 ...
- C++多线程同步技巧(二)--- 事件
简介 Windows在线程控制方面提供了多种信号处理机制,其中一种便是使用 CreateEvent() 函数创建事件,然后使用信号控制线程运行.其中将事件变为有信号可使用 SetEvent() 函数, ...
- C++多线程同步技巧(四)--- 信号量
简介 信号量是维护0到指定最大值之间的同步对象.信号量状态在其计数大于0时是有信号的,而其计数是0时是无信号的.信号量对象在控制上可以支持有限数量共享资源的访问,可以用于线程同步,预防死锁等领域. 信 ...
- C++多线程同步技巧(三)--- 互斥体
简介 Windows互斥对象机制. 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问,在线程同步与保证程序单体运行上都有相当大的用处. 代码 ...
- 【delphi】多线程与多线程同步
在 Delphi 中使用多线程有两种方法: 调用 API.使用 TThread 类; 使用 API 的代码更简单. CreateThread function CreateThread( lpThre ...
- windows多线程同步--临界区
推荐参考博客:秒杀多线程第五篇 经典线程同步 关键段CS 关于临界区的观念,一般操作系统书上面都有. 适用范围:它只能同步一个进程中的线程,不能跨进程同步.一般用它来做单个进程内的代码快同步,效率 ...
- C# 多线程同步和线程通信
多线程通信 1. 当线程之间有先后的依赖关系时,属于线程之间的通信问题.也就是后一个线程要等待别的一个或多个线程全部完成,才能开始下一步的工作.可以使用: WaitHandle Class WaitH ...
- 总结windows多线程同步互斥
windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...
- 知识点干货—多线程同步【6】之synchronized
"明日复明日,明日何其多. 我生待明日,万事成蹉跎. 世人若被明日累,春去秋来老将至. 朝看水东流,暮看日西坠. 百年明日能几何?请君听我明日歌. 明日复明日,明日何其多! 日日待明日,万世 ...
随机推荐
- oracle10G/11G官方迅雷下载地址合集
原文链接:https://blog.csdn.net/zlsunnan/article/details/8058235 ORACLE11GR2 Oracle Database 11g Release ...
- Jquery里的特定小技巧
jQuery 动态设置样式: https://blog.csdn.net/xiaoyuncc/article/details/70854925 jquery如 ...
- mysql+高可用MMM
一. MMM 简介:MMM 即 Multi-Master Replication Manager for MySQL:mysql 多主复制管理器,基于 perl 实现,关于 mysql 主主复制配置的 ...
- ABP框架 sql语句(转载)
ABP.Core实现SQL语句仓储,支持EF.Core兼容的数据库 来源:https://blog.csdn.net/qq_28699537/article/details/80522680?tds ...
- PHP 依赖注入和控制反转再谈(二)
今天有个朋友看到yii2中介绍的依赖注入一头雾水,之前我写过类似的文章发给他看了,可能还没深入理解吧,这里我再通俗点描述下依赖注入的原理吧,尽可能滴说通俗易懂一点吧:先还是扯下概念性滴问题(概念问题我 ...
- trivial and nontrivial
Trivial A solution or example that is ridiculously simple and of little interest. Often, solutions o ...
- 快速掌握JavaScript面试基础知识(二)
译者按: 总结了大量JavaScript基本知识点,很有用! 原文: The Definitive JavaScript Handbook for your next developer interv ...
- js对HTML字符转义与反转义
注意: 在编写html时,经常需要转义,才能正常显示在页面上. 并且,还可以防止xss. 解决方案: 一, 使用正则: 使用正则转码: var value = document.getElementB ...
- es6 语法 (iterator和for...of循环)
Iterator遍历器 遍历器(Iterator)就是这样一种机制.它是一种接口,为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据 ...
- 51nod1238 最小公倍数之和 V3(莫比乌斯反演)
题意 题目链接 Sol 不想打公式了,最后就是求一个 \(\sum_{i=1}^n ig(\frac{N}{i})\) \(g(i) = \sum_{i=1}^n \phi(i) i^2\) 拉个\( ...