C++ EnterCriticalSection简单使用

目录
  • EnterCriticalSection作用
  • 一、首先是它的使用步骤:
  • 二、示例代码:

EnterCriticalSection作用

用途主要是在多线程中,当开启多线程中,要控制函数的执行顺序时,就需要用到它了,就是假如多个线程同时访问这个函数时,需要控制执行的顺序,可以使用它去控制顺序。

定义一个全局的锁 CRITICAL_SECTION的实例

和一个静态全局变量

  • CRITICAL_SECTION cs;//可以理解为锁定一个资源
  • static int n_AddValue = 0;//定义一个静态的全部变量n_AddValue实战

一、首先是它的使用步骤:

//1.创建全局互斥量
CRITICAL_SECTION g_cs;

//2.初始化互斥量
InitializeCriticalSection(&g_cs);//必须添加,否则会报错

//3.进入
EnterCriticalSection(&g_cs);

//4.离开
LeaveCriticalSection(&g_cs);

二、示例代码:

// DefDemo.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
using namespace std;

CRITICAL_SECTION g_cs;

struct gParam
{
 int m;
 int n;
};

void WINAPI getMax(gParam * cur_Param)
{
 EnterCriticalSection(&g_cs);
 if (cur_Param->m > cur_Param->n)
 {
  cout << "MAX_VALUE:"<< cur_Param->m << endl;
 }
 else
 {
  cout << "MAX_VALUE:"<< cur_Param->n << endl;
 }
 LeaveCriticalSection(&g_cs);
 return;
}

int _tmain(int argc, _TCHAR* argv[])
{
 InitializeCriticalSection(&g_cs);
 gParam * cur_Param = new gParam;
 cur_Param->m = 2;
 cur_Param->n = 5;

 gParam * cur_NexParam = new gParam;
 cur_NexParam->m = 10;
 cur_NexParam->n = 2;
 CreateThread(nullptr,0,(LPTHREAD_START_ROUTINE)getMax,cur_Param,0,0);
 CreateThread(nullptr,0,(LPTHREAD_START_ROUTINE)getMax,cur_NexParam,0,0);
 system("pause");
 delete cur_Param;
 return 0;
}

运行结果:

到此这篇关于C++ EnterCriticalSection简单使用的文章就介绍到这了,更多相关C++ EnterCriticalSection内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • spring cloud consul注册的服务报错critical的解决

    测试spring cloud 使用consul注册服务的时候,出现critical,如下: 怎么解决这个问题,现在只能看到health check检查失败了. 受限调用这个请求Get http://consulIp:8500/v1/agent/checks,调完请求,就会拿到返回数据: { ...... "service:test-service-xx-xx-xx-xx": { "Node": "zookeeper-server1", "

  • CRITICAL_SECTION用法案例详解

          很多人对CRITICAL_SECTION的理解是错误的,认为CRITICAL_SECTION是锁定了资源,其实,CRITICAL_SECTION是不能够"锁定"资源的,它能够完成的功能,是同步不同线程的代码段.简单说,当一个线程执行了EnterCritialSection之后,cs里面的信息便被修改,以指明哪一个线程占用了它.而此时,并没有任何资源被"锁定".不管什么资源,其它线程都还是可以访问的(当然,执行的结果可能是错误的).只不过,在这个线程尚未执

  • C++使用CriticalSection实现线程同步实例

    本文实例讲述了C++使用CriticalSection实现线程同步的方法,在前文C++线程同步实例分析的基础上增加了四行代码,使用了四个函数: EnterCriticalSection ::DeleteCriticalSection ::EnterCriticalSection ::LeaveCriticalSection此时,打印出来的数字就相等了. 具体代码如下: #include "stdafx.h" #include <Windows.h> DWORD g_cnt1

  • IDEA遇到Internal error. Please refer to http://jb. gg/ide/critical-startup-errors的问题及解决办法

    今天打算把原本的2018的idea升个级,安一个2020 的idea试试各种新插件,但遇到了很多问题,比如安装后打不开,好不容易打开了然后报错 Internal error. Please refer to http://jb. gg/ide/critical-startup-errors  ... Caused by: java. lang. ClasslotFoundException: com rover12421. crack. jetbrains. v2. Util at com in

  • C++ EnterCriticalSection简单使用

    目录 EnterCriticalSection作用 一.首先是它的使用步骤: 二.示例代码: EnterCriticalSection作用 用途主要是在多线程中,当开启多线程中,要控制函数的执行顺序时,就需要用到它了,就是假如多个线程同时访问这个函数时,需要控制执行的顺序,可以使用它去控制顺序. 定义一个全局的锁 CRITICAL_SECTION的实例 和一个静态全局变量 CRITICAL_SECTION cs;//可以理解为锁定一个资源 static int n_AddValue = 0;//

  • Python实现一个简单的验证码程序

    老师讲完random函数,自己写的,虽然和老师示例的不那么美观,智能,但是也自己想出来的,所以记录一下,代码就需要自己不断的自己练习,实战,才能提高啊!不然就像我们这些大部分靠自学的人,何时能学会.还有就是,这次听老师的,把自己的代码添加注释,所以这次把很简单的代码都写上了注释,而且很大白话,不管有没有接触过python的,我相信仔细看了,肯定能看懂.如果看完,再自己尝试着默写出来,那就是更好到了,好了进入正题: 自己写的: __Author__ = "Zhang Peng" impo

  • 简单了解Python中的几种函数

    几个特殊的函数(待补充) python是支持多种范型的语言,可以进行所谓函数式编程,其突出体现在有这么几个函数: filter.map.reduce.lambda.yield lambda >>> g = lambda x,y:x+y #x+y,并返回结果 >>> g(3,4) 7 >>> (lambda x:x**2)(4) #返回4的平方 16 lambda函数的使用方法: 在lambda后面直接跟变量 变量后面是冒号 冒号后面是表达式,表达式计算

  • mysql 5.7.20常用下载、安装和配置方法及简单操作技巧(解压版免安装)

    话说凌晨刚折腾完一台MySQL 5.7.19版本的安装,未曾料到早上MySQL官方就发布了最新的5.7.20版本.这个版本看似更新不多,但是加入了一个我们所急需的功能. MySQL 5.7.20版本新增了参数group-replication-member-weight,用来表示选主时服务器的优先级.若没有这个优先级,则之前版本的MGR会选择一个或许不是用户想要的节点,这是一个令人头疼的问题.相信5.7.20版本新增的该参数能解决一些用户的痛点. 1. 下载: mysql-5.7.20是解压版免

  • js中apply与call简单用法详解

    你可以直接看例子,也可以先读一下介绍: call和apply是为了动态改变this而出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作. call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性.既然作为方法的属性,那它们的使用就当然是针对方法的了.这两个方

  • js实现简单数字变动效果

    本文实例为大家分享了js实现数字变动效果展示的具体代码,供大家参考,具体内容如下 $.fn.countTo = function (options) { options = options || {};//当options未被初始化,即typeof options = 'undefined'时,执行后面部分即var options = {}来初始化一个对象 return $(this).each(function () { // set options for current element v

  • PHP简单实现欧拉函数Euler功能示例

    本文实例讲述了PHP简单实现欧拉函数Euler功能.分享给大家供大家参考,具体如下: 欧拉函数ph(n)的意思是所有小于n且与n互质的个数. 比如说ph(10) = 4{1,3,7,9与10互质} 代码如下: <?php function Euler($x) { $res = $x; $now = 2; while ($x > 1) { if ($x % $now == 0) { $res /= $now; $res *= ($now - 1); while ($x % $now == 0)

  • python 简单备份文件脚本v1.0的实例

    整体思路 将要备份的目录列为一个列表,通过执行系统命令,进行压缩.备份. 这样关键在于构造命令并使用 os.system( )来执行,一开始使用zip 命令始终没有成功,后来发现Windows下并没有这个命令,还要安装GnuWin32项目,后来安装了7z,实现了使用系统命令进行压缩. 压缩命令 通过下载7z压缩,将7z.exe 7z,dll 加入系统环境变量目录,通过以下命令进行压缩.解压7z a test.zip a.txt b.txt # 指定若干文件 7z a test.zip f:/te

  • Git的简单理解及基础操作命令详解

    git和svn有什么区别呢? git采用分布式版本库管理,而svn采用集中式版本库管理. 集中式版本库管理需要有一台存放版本库的服务器,开发人员在开发的时候分别从服务器拉取过来最新版本,然后创建/进入分支进行开发,开发完成之后将分支提交或者合并到主分支. 分布式版本库管理允许开发者们将版本库搬到自己的电脑上,在开发过程中,开发者们可以根据不同的目的创建分支和修改代码,开发完成后进行各项合并,这样做提高了开发的敏捷性和速度,并且减少了公共服务器的压力,且任意两个开发者之间的冲突更容易得到解决. g

  • QQ聊天记录删除了怎么恢复简单方法

    现在朋友之间交流,基本是都是通过QQ聊天,如果你一不小心把重要的聊天记录删除了该怎么办呢?下面小编就教你一些小窍门,保证解决你的难题. 第一种:向朋友请求帮助 相信我们大家都知道QQ聊天记录会在双方的电脑上保留着, 你电脑上的删除了,对方的电脑上可能还保留着.所以假如你和某个朋友聊天记录一不小心被删除了,你可以向你的朋友请求帮助,登陆QQ,找到你那个朋友让他把聊天记录导出一份给你.相信这是最为快速方便的一种方法了. 第二种:利用文件夹 如果对方也把QQ聊天记录删除了,又该怎么办呢?那我们就利用第

随机推荐