imtoken钱包下载手机版|ccriticalsection

作者: imtoken钱包下载手机版
2024-03-07 17:44:30

CCriticalSection 类 | Microsoft Learn

CCriticalSection 类 | Microsoft Learn

跳转至主内容

此浏览器不再受支持。

请升级到 Microsoft Edge 以使用最新的功能、安全更新和技术支持。

下载 Microsoft Edge

有关 Internet Explorer 和 Microsoft Edge 的详细信息

目录

退出焦点模式

语言

使用英语阅读

保存

目录

使用英语阅读

保存

打印

Twitter

LinkedIn

Facebook

电子邮件

目录

CCriticalSection 类

项目

10/12/2023

8 个参与者

反馈

本文内容

表示一个“关键部分”- 一次支持一个线程访问资源或代码段的同步对象。

语法

class CCriticalSection : public CSyncObject

成员

公共构造函数

名称

描述

CCriticalSection::CCriticalSection

构造 CCriticalSection 对象。

公共方法

名称

描述

CCriticalSection::Lock

用于获取对 CCriticalSection 对象的访问权限。

CCriticalSection::Unlock

释放 CCriticalSection 对象。

公共运算符

“属性”

描述

CCriticalSection::operator CRITICAL_SECTION*

检索指向内部 CRITICAL_SECTION 对象的指针。

公共数据成员

“属性”

描述

CCriticalSection::m_sect

CRITICAL_SECTION 对象。

备注

当一次只允许一个线程修改数据或其他一些受控资源时,关键部分非常有用。 例如,将节点添加到链接列表就是一次只允许一个线程的进程。 通过使用 CCriticalSection 对象来控制链接列表,一次只有一个线程可以访问该列表。

注意

CCriticalSection 类的功能由实际的 Win32 CRITICAL_SECTION 对象提供。

在速度至关重要并且不会跨进程边界使用资源时,将使用关键部分而不是互斥体(请参阅 CMutex)。

可通过两种方法使用 CCriticalSection 对象:独立和嵌入类中。

独立方法 若要使用独立 CCriticalSection 对象,请根据需要构造 CCriticalSection 对象。 从构造函数成功返回后,通过调用 Lock 显式锁定对象。 访问关键部分后,调用 Unlock。 此方法虽然对读取源代码的用户更清晰,但更容易出错,因为必须记住在访问之前和之后锁定和解锁关键部分。

更可取的方法是使用 CSingleLock 类。 它还有 Lock 和 Unlock 方法,但如果发生异常,你不必担心解锁资源的问题。

嵌入方法 还可以通过将 CCriticalSection 类型的数据成员添加到类并在需要时锁定数据成员来与多个线程共享该类。

有关使用 CCriticalSection 对象的详细信息,请参阅多线程:如何使用同步类一文。

继承层次结构

CObject

CSyncObject

CCriticalSection

要求

标头afxmt.h:

CCriticalSection::CCriticalSection

构造 CCriticalSection 对象。

CCriticalSection();

备注

若要访问或释放 CCriticalSection 对象,请创建一个 CSingleLock 对象并调用其 Lock 和 Unlock 成员函数。 如果以独立方式使用 CCriticalSection 对象,请调用其 Unlock 成员函数以释放它。

如果构造函数无法分配所需的系统内存,则会自动引发 CMemoryException 类型的内存异常。

示例

查看 CCriticalSection::Lock 的示例。

CCriticalSection::Lock

调用此成员函数以获取关键部分对象的访问权限。

BOOL Lock();

BOOL Lock(DWORD dwTimeout);

参数

dwTimeoutLock 将忽略此参数值。

返回值

如果该函数成功,则为非零;否则为 0。

备注

Lock 是一个阻塞性调用,在关键部分对象发出信号(变为可用)后才会返回。

如果需要计时等待,可以使用 CMutex 对象,而不是 CCriticalSection 对象。

如果 Lock 构造函数无法分配所需的系统内存,则会自动引发 CMemoryException 类型的内存异常。

示例

此示例通过控制对使用共享 CCriticalSection 对象的共享资源(静态 _strShared 对象)的访问来演示嵌套的关键部分方法。 SomeMethod 函数演示如何以安全方式更新共享资源。

//Definition of critical section class

class CMyCritSectClass

{

static CString _strShared; //shared resource

static CCriticalSection _critSect;

public:

CMyCritSectClass(void) {}

~CMyCritSectClass(void) {}

void SomeMethod(void); //locks, modifies, and unlocks shared resource

};

//Declaration of static members and SomeMethod

CString CMyCritSectClass::_strShared;

CCriticalSection CMyCritSectClass::_critSect;

void CMyCritSectClass::SomeMethod()

{

_critSect.Lock();

if (_strShared == "")

_strShared = "";

_critSect.Unlock();

}

CCriticalSection::m_sect

包含所有 CCriticalSection 方法使用的临界区对象。

CRITICAL_SECTION m_sect;

CCriticalSection::operator CRITICAL_SECTION*

检索 CRITICAL_SECTION 对象。

operator CRITICAL_SECTION*();

备注

调用此函数以检索指向内部 CRITICAL_SECTION 对象的指针。

CCriticalSection::Unlock

释放 CCriticalSection 对象以供另一个线程使用。

BOOL Unlock();

返回值

如果 CCriticalSection 对象由线程拥有且释放成功,则为非零;否则为 0。

注解

如果正在以独立方式使用 CCriticalSection,则必须在使用完关键部分控制的资源后立即调用 Unlock。 如果正在使用 CSingleLock 对象,则由锁定对象的 Unlock 成员函数调用 CCriticalSection::Unlock。

示例

请参阅 CCriticalSection::Lock 的示例。

另请参阅

CSyncObject 类

层次结构图

CMutex 类

反馈

此页面是否有帮助?

提供产品反馈

|

在 Microsoft Q&A 获取帮助

反馈

Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see: https://aka.ms/ContentUserFeedback.

提交和查看相关反馈

此产品

此页面

查看所有页面反馈

其他资源

加州消费者隐私法案 (CCPA) 禁用图标

你的隐私选择

主题

高对比度

早期版本

博客

参与

隐私

使用条款

商标

© Microsoft 2024

其他资源

本文内容

加州消费者隐私法案 (CCPA) 禁用图标

你的隐私选择

主题

高对比度

早期版本

博客

参与

隐私

使用条款

商标

© Microsoft 2024

MFC线程同步—— CCriticalSection类使用_mfc critical_section 自动释放-CSDN博客

>

MFC线程同步—— CCriticalSection类使用_mfc critical_section 自动释放-CSDN博客

MFC线程同步—— CCriticalSection类使用

最新推荐文章于 2023-06-06 03:21:01 发布

剑若问天

最新推荐文章于 2023-06-06 03:21:01 发布

阅读量3.1k

收藏

7

点赞数

2

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_24343479/article/details/53179066

版权

MFC

专栏收录该内容

9 篇文章

0 订阅

订阅专栏

多个线程访问临界区时,可以使用临界区对象。临界区对象是一个独占性共享资源,任一时刻只有一个线程可以拥有临界区。拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止。

CCriticalSection类的用法:

方法一:

(1)定义CCriticalSection类的一个全局对象(以使各个线程均能访问):

       CCriticalSectioncritical_section;

(2)在访问临界区之前,调用CCriticalSection类的成员函数Lock()获得临界区:

        critical_section.Lock();

在线程中调用该函数来使线程获得它所请求的临界区。如果此时没有其他线程占有临界区,则调用Lock()的线程获取临界区;否则,线程即将挂起,并放入到一个系统队列中等待,直到当前拥有临界区的线程释放了临界区时为止。

  (3)在本线程中访问临界区中的共享资源。

(4)访问临界区完毕后,使用CCriticalSection类的成员函数UnLock()来释放临界区:

      critical.section.UnLock();

 

方法二:

  与同步辅助类CSingleLock或CMutiLock类一起使用

(1)定义CCriticalSection类的一个全局对象(以使各个线程均能访问):

       CCriticalSection critical_section;

(2)在访问临界区之前,定义CSingleLock类的一个对象,并将critical_section的地址传送给构造函数:

         CSingleLocksinglelock(&critical_section);

(3)使用CSingleLock类的成员函数Lock()请求获得临界区:

        singlelock.Lock();

(4)在本线程中访问临界区中的共享资源。

(5)调用CSingleLock类的成员函数UnLock()来释放临界区:

       singlelock.UnLock();

方法一:

定义一个CCriticalSection类的一个全局变量和一个共享资源的字符数组g_Array

CCriticalSection critical_section;

TCHAR g_Array[10] = _T("\0");

定义2个线程,共享g_Array数组资源

UINT WriteA(LPVOID pParam);

UINT WriteB(LPVOID pParam);

//pParam为创建afxBeginThread()函数的第二个参数

UINT WriteA(LPVOID pParam)

{

CEdit *pEdit = (CEdit*)pParam; //pEdit为控制EDITA编辑框

pEdit->SetWindowText(_T(""));

critical_section.Lock(); //上锁

//临界区

for (int i = 0; i < 9; i++)

{

g_Array[i] = _T('A');

pEdit->SetWindowText(g_Array);

Sleep(1000);

}

critical_section.Unlock();//解锁

return 0;

}

UINT WriteB(LPVOID pParam)

{

CEdit *pEdit = (CEdit*)pParam;

pEdit->SetWindowText(_T("\0"));

critical_section.Lock();

//临界区资源(g_Array)

for (int i = 0; i < 9; i++)

{

g_Array[i] = _T('B');

pEdit->SetWindowText(g_Array);

Sleep(1000);

}

critical_section.Unlock();

return 0;

}

//按钮启动线程A

void CThreadLockDlg::OnBnClickedWritea()

{

// TODO: 在此添加控件通知处理程序代码

AfxBeginThread(WriteA, &m_CEditA); //参数表示EDIT控件变量

}

//启动线程B

void CThreadLockDlg::OnBnClickedWriteb()

{

// TODO: 在此添加控件通知处理程序代码

AfxBeginThread(WriteB, &m_CEditB);

}

   

优惠劵

剑若问天

关注

关注

2

点赞

7

收藏

觉得还不错?

一键收藏

知道了

0

评论

MFC线程同步—— CCriticalSection类使用

多个线程访问临界区时,可以使用临界区对象。临界区对象是一个独占性共享资源,任一时刻只有一个线程可以拥有临界区。拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止。CCriticalSection类的用法:方法一:(1)定义CCriticalSection类的一个全局对象(以使各个线程均能访问):

复制链接

扫一扫

专栏目录

[MFC]MFC同步类总结

超越

05-09

1989

MFC同步类

CCriticalSection临界区:在用户模式工作(遇到加锁等待时会进入内核模式),使用与保护线程间共享资源,一个线程可以多次Lock不会错。不支持在多进程之间工作。将一段代码置入临界区,只允许最多一个线程进入执行这段代码。一个临界区仅在创建它的进程中有效。CMutex互斥量:在内核模式工作,除支持临界区的功能外,还可以为互斥量命名,以便在多进程中工作。互斥量比临界区耗

多线程同步利用ccriticalsection

04-22

mfc多线程编程,利用CCriticalSection对象进行线程间的同步,很适合初学者。

参与评论

您还未登录,请先

登录

后发表或查看评论

如何使用CCriticalSection类

07-02

如何使用CCriticalSection类

如何使用CCriticalSection类

如何使用CCriticalSection类

VC++ 线程同步之临界区(CriticalSection)

qq_41317716的博客

06-06

553

VC++ 线程同步之临界区(CriticalSection)

MFC CCriticalSection 关键段例子

04-17

MFC CCriticalSection 关键段例子

使用多线程对关键段保护!

1 对vector 写入 线程

2 对vector 读出 线程

MFC CCriticalSection 关键段

SelfImprovement

04-17

2067

和其他同步对象不同,除非有需要以外,关键区域工作在用户模式下。若一个线程想运行一个封装在关键区域中的代码,它首先做一个旋转封锁,然后等待特定的时间,它进入内核模式去等待关键区域。

实际上,关键区域持有一个旋转计数器和一个信号量,前者用于用户模式的等待,后者用于内核模式的等待(休眠态)。在Win32API中,有一个CRITICAL_SECTION结构体表示关键区域对象。在MFC中,有一个类CCri

MFC学习笔记——多线程学习

xzsfg6825的博客

05-07

2354

一、多线程编程思想1、 Windows线程(1)在Windows平台上,从根本上可以利用CPU执行代码的最小实体就是线程(2)首先从内核角度看,线程是一个内核对象,系统用它来存储一些关于线程的统计信息等(比如运行时间)(3)其次从编程的角度看,线程是一堆寄存器状态以及线程栈的一个结构体对象,本质上可以理解为一个函数调用器(寄存器状态用于控制CPU执行,栈用于存储局部变量和函数调用参数及函数返回地址...

CCriticalSection的使用

架构设计

10-17

747

CCriticalSection是对关键段CRITICAL_SECTION的封装。

关键段(critival section)是一小段代码,他在执行之前需要独占对一些共享资源的访问权。这种方式可以让多行代码以“原子方式”来对资源进行操控。这里的“原子方式”,指的是代码知道除了当前线程之外没有其他任何线程会同时访问该资源。当然,系统仍然可以暂停当前线程去调度其他线程。但是,在当前线程离开关键段...

MFC线程同步之临界区CCriticalSection

weixin_44641897的博客

02-02

192

MFC线程同步之临界区

一、临界区

1. 定义指针

指针定义为全局函数

// 临界区

CCriticalSection* g_pCS;

2. 构造函数初始化

C线程同步Dlg::C线程同步Dlg(CWnd* pParent /*=NULL*/)

: CDialogEx(C线程同步Dlg::IDD, pParent)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

g_pCS = new CCriticalSection();

}

3.析构

MFC多线程同步

qq_47999510的博客

12-28

1321

MFC提供了多种同步对象,下面我们只介绍最常用的四种:

1、临界区(CCriticalSection)

2、事件(CEvent)

3、互斥量(CMutex)

4、信号量(CSemaphore)

一、临界区

使用CCriticalSection类。是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。临界区在控制一次只有一个线程修改数据或其它的控制资源时非常有用。

class CCriticalSection...

多线程临界段类同步演示1

02-18

多线程同步演示1,采用MFC的临界段类CCriticalSection来实现多线程同步。

使用临界区线程同步示例代码VC源代码

03-15

本代码演示了利用临界区实现线程的同步。 关键字:CCriticalSection,临界区

它使用了同步对象保护线程请求的数据.zip_数据 线程

09-22

由Visual C++ 4.1开发的一个ISAPI应用,它使用了同步对象(CCriticalSection)来保护线程请求的数据

springboot学生毕业离校系统PPT

最新发布

03-06

一年一度的毕业季的到来,方方面面都普及使得学生毕业离校系统的开发成为必需。学生毕业离校系统主要是借助计算机,通过对学生、教师、离校信息、费用结算、论文审核等信息进行管理。为减少管理员的工作,同时也方便广大学生对个人所需毕业离校的及时查询以及管理。

学生毕业离校系统的开发过程中,采用B / S架构,主要使用Java技术进行开发,结合最新流行的springboot框架。中间件服务器是Tomcat服务器,使用Mysql数据库和Eclipse开发环境。该学生毕业离校系统包括管理员、学生和教师。其主要功能包括管理员:首页、个人中心、学生管理、教师管理、离校信息管理、费用结算管理、论文审核管理、管理员管理、留言板管理、系统管理等,前台首页;首页、离校信息、网站公告、留言反馈、个人中心、后台管理等,学生:首页、个人中心、费用结算管理、论文审核管理、我的收藏管理、等,教师:首页、个人中心、学生管理、离校信息管理、费用结算管理、论文审核管理等功能。

本论文对学生毕业离校系统的发展背景进行详细的介绍,并且对系统开发技术进行介绍,然后对系统进行需求分析,对学生毕业离校系统业务信息、系统结构以及数据都进行详细

Java毕设-基于SpringBoot+Vue的宠物商城网站设计与实现(附源码,数据库,教程).zip

03-06

Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。

包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。

该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

项目都经过严格调试,确保可以运行!

1. 技术组成

前端:html、javascript、Vue

后台框架:SpringBoot

开发环境:idea

数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑)

数据库工具:navicat

部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven

2. 部署

如果部署有疑问的话,可以找我咨询

后台路径地址:localhost:8080/项目名称/admin/dist/index.html

前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

财富管理系统,全球前10强生产商排名及市场份额调研数据.pdf

03-06

财富管理系统,全球前10强生产商排名及市场份额调研数据

springboot139基于SpringBoot华强北商城二手手机管理系统-毕业源码案例设计

03-06

进入21世纪网络和计算机得到了飞速发展,并和生活进行了紧密的结合。目前,网络的运行速度以达到了千兆,覆盖范围更是深入到生活中的角角落落。这就促使二手交易网站的发展。二手交易网站可以实现远程购物,远程选择喜欢的商品和随时追踪订单的状态。二手交易网站给人们带来前所未有的体验,满足了新时代人们的购物需求,所以网上二手交易模式得到大力发展。

本系统为基于Springboot的华强北商城二手手机管理系统,是采用计算机和网络技术进行开发的在线交易平台,可以实现商品的展示、购买、评价以及销售等。本系统采用Java语言,数据库为Mysql,运行环境为Idea。使用角色分为注册用户、游客、管理员、商家,本系统的功能包括新闻管理、商品信息展示以及管理、注册用户管理、订单管理、商品评价同时还可以管理购物车。其中,游客负责浏览信息,注册用户可以购买商品、评价商品、管理订单,商家可以销售商品管理订单,管理员可以管理所有功能以及个人信息。本系统实现了商品的在线销售与购买,方便了购买者和销售者双方的利益,提高销量和购买效率,更符合现代人生活。

关键词:购物车,用户注册,商品信息管理,订单管理,Java语言

c语言文件读写操作代码

03-06

c语言文件读写操作代码

基于SSM框架的前后端分离设计完整仿天猫网站服务器端源码。

03-06

资源简介:SSM Java 项目集合

一、概述

在这个平台上,我们为大家带来了一系列的 JavaSSM(Spring + SpringMVC + MyBatis)项目。这些项目旨在展示SSM框架在实际应用中的魅力,同时也为开发者提供了一个快速学习和实践的机会。通过下载和使用这些项目,您将能够深入了解SSM框架的核心概念、设计模式和最佳实践。

二、项目特点

实战性强:这些项目均来自实际业务场景多个领域,具有很强的实战性和参考价值。

技术先进:所有项目均采用最新的SSM框架版本,包括Spring 、SpringMVC 和MyBatis 等,确保技术的先进性和稳定性。

代码规范:项目代码严格按照行业标准和最佳实践进行编写,易于阅读和维护。

文档齐全:每个项目都配备了详细的开发文档和使用说明,方便您快速上手和定制开发。

三、适用人群

Java初学者:通过学习和实践这些项目,您将能够快速掌握SSM框架的基础知识和核心技术。

中高级开发者:这些项目将为您提供丰富的实战经验和灵感,帮助您提升技术水平和解决问题的能力。

项目经理和架构师:这些项目可以作为参考和模板,帮助您更好地规划和设计实际业务场景中的Java项目。

四、下载与使用

下载:所有项目均提供下载,您只需在平台上注册并登录即可获取。

安装与部署:每个项目都提供了详细的安装和部署指南,帮助您快速搭建和运行项目。

定制开发:您可以根据实际需求对项目进行定制开发,扩展功能和优化性能。

五、结语

通过这一系列SSM Java项目的下载和学习,您将能够深入了解SSM框架的核心技术,提升自己的编程能力,并在实际业务场景中灵活应用。我们期待您能够通过这些项目获得更多的成长和进步!

mfc 多线程简单入门

02-02

MFC(Microsoft Foundation Classes)是微软开发的一种应用程序框架,它可以简化Windows应用程序的开发。多线程指的是在一个程序中同时运行多个线程,每个线程可以独立执行不同的任务。使用MFC进行多线程编程可以提高程序的性能和响应速度。

在MFC中,我们可以使用CWinThread类来创建和管理线程。首先,我们需要继承CWinThread类并重写其Run函数,在Run函数中编写线程的执行逻辑。然后,通过调用CWinThread的CreateThread函数创建并启动线程。

在多线程编程中,需要特别注意线程之间的同步和互斥。MFC提供了一些同步对象,例如CSemaphore、CCriticalSection等,用于实现线程之间的同步操作。我们可以使用这些同步对象来避免多个线程同时访问共享资源,从而避免发生竞态条件和数据不一致问题。

当然,在多线程编程中,还需要注意避免产生死锁和线程间的资源竞争问题。为了避免死锁,我们可以遵循一些原则,例如按照相同的顺序获取锁、避免嵌套锁等。对于资源竞争问题,我们可以使用互斥锁等同步机制来保证共享资源的正确访问。

总而言之,MFC多线程编程是利用MFC框架进行多线程应用程序的开发。通过继承和重写CWinThread类,我们可以创建和管理多个线程,并使用MFC提供的同步对象来实现线程之间的同步。同时,需要注意避免死锁和资源竞争问题。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

剑若问天

CSDN认证博客专家

CSDN认证企业博客

码龄9年

暂无认证

27

原创

75万+

周排名

152万+

总排名

4万+

访问

等级

579

积分

5

粉丝

8

获赞

3

评论

53

收藏

私信

关注

热门文章

Pod基本概念

8764

MFC 多线程—— CMutex类使用

6881

MongoDB报Too many open files解决方法

4459

MFC线程同步—— CCriticalSection类使用

3174

mongdb事务

1552

分类专栏

Kafka专栏

k8s

3篇

ES

2篇

mongo

2篇

nginx

1篇

C语言

8篇

网络编程

2篇

大数据

3篇

最新评论

MongoDB报Too many open files解决方法

water___Wang:

linux惊群效应

water___Wang:

受教了~

CTabControl使用(系统配置程序部分功能)

yyang0514:

请问有没有办法设置CTABCTRL的默认焦点

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

Controller控制器

ElasticSearch基本操作

Pod基本概念

2021年10篇

2020年1篇

2017年3篇

2016年15篇

2015年7篇

目录

目录

分类专栏

Kafka专栏

k8s

3篇

ES

2篇

mongo

2篇

nginx

1篇

C语言

8篇

网络编程

2篇

大数据

3篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

CCriticalSection Class | Microsoft Learn

CCriticalSection Class | Microsoft Learn

Skip to main content

This browser is no longer supported.

Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.

Download Microsoft Edge

More info about Internet Explorer and Microsoft Edge

Table of contents

Exit focus mode

Language

Read in English

Save

Table of contents

Read in English

Save

Edit

Print

Twitter

LinkedIn

Facebook

Email

Table of contents

CCriticalSection Class

Article

03/01/2022

8 contributors

Feedback

In this article

Represents a "critical section" — a synchronization object that allows one thread at a time to access a resource or section of code.

Syntax

class CCriticalSection : public CSyncObject

Members

Public Constructors

Name

Description

CCriticalSection::CCriticalSection

Constructs a CCriticalSection object.

Public Methods

Name

Description

CCriticalSection::Lock

Use to gain access to the CCriticalSection object.

CCriticalSection::Unlock

Releases the CCriticalSection object.

Public Operators

Name

Description

CCriticalSection::operator CRITICAL_SECTION*

Retrieves a pointer to the internal CRITICAL_SECTION object.

Public Data Members

Name

Description

CCriticalSection::m_sect

A CRITICAL_SECTION object.

Remarks

Critical sections are useful when only one thread at a time can be allowed to modify data or some other controlled resource. For example, adding nodes to a linked list is a process that should only be allowed by one thread at a time. By using a CCriticalSection object to control the linked list, only one thread at a time can gain access to the list.

Note

The functionality of the CCriticalSection class is provided by an actual Win32 CRITICAL_SECTION object.

Critical sections are used instead of mutexes (see CMutex) when speed is critical and the resource won't be used across process boundaries.

There are two methods for using a CCriticalSection object: stand-alone and embedded in a class.

Stand-alone method To use a stand-alone CCriticalSection object, construct the CCriticalSection object when it's needed. After a successful return from the constructor, explicitly lock the object with a call to Lock. Call Unlock when you're done accessing the critical section. This method, while clearer to someone reading your source code, is more prone to error as you must remember to lock and unlock the critical section before and after access.

A more preferable method is to use the CSingleLock class. It also has a Lock and Unlock method, but you don't have to worry about unlocking the resource if an exception occurs.

Embedded method You can also share a class with multiple threads by adding a CCriticalSection-type data member to the class and locking the data member when needed.

For more information on using CCriticalSection objects, see the article Multithreading: How to Use the Synchronization Classes.

Inheritance Hierarchy

CObject

CSyncObject

CCriticalSection

Requirements

Header: afxmt.h

CCriticalSection::CCriticalSection

Constructs a CCriticalSection object.

CCriticalSection();

Remarks

To access or release a CCriticalSection object, create a CSingleLock object and call its Lock and Unlock member functions. If the CCriticalSection object is being used stand-alone, call its Unlock member function to release it.

If the constructor fails to allocate the required system memory, a memory exception (of type CMemoryException) is automatically thrown.

Example

See the example for CCriticalSection::Lock.

CCriticalSection::Lock

Call this member function to gain access to the critical section object.

BOOL Lock();

BOOL Lock(DWORD dwTimeout);

Parameters

dwTimeout

Lock ignores this parameter value.

Return Value

Nonzero if the function was successful; otherwise 0.

Remarks

Lock is a blocking call that won't return until the critical section object is signaled (becomes available).

If timed waits are necessary, you can use a CMutex object instead of a CCriticalSection object.

If Lock fails to allocate the necessary system memory, a memory exception (of type CMemoryException) is automatically thrown.

Example

This example demonstrates the nested critical section approach by controlling access to a shared resource (the static _strShared object) using a shared CCriticalSection object. The SomeMethod function demonstrates updating a shared resource in a safe manner.

//Definition of critical section class

class CMyCritSectClass

{

static CString _strShared; //shared resource

static CCriticalSection _critSect;

public:

CMyCritSectClass(void) {}

~CMyCritSectClass(void) {}

void SomeMethod(void); //locks, modifies, and unlocks shared resource

};

//Declaration of static members and SomeMethod

CString CMyCritSectClass::_strShared;

CCriticalSection CMyCritSectClass::_critSect;

void CMyCritSectClass::SomeMethod()

{

_critSect.Lock();

if (_strShared == "")

_strShared = "";

_critSect.Unlock();

}

CCriticalSection::m_sect

Contains a critical section object that is used by all CCriticalSection methods.

CRITICAL_SECTION m_sect;

CCriticalSection::operator CRITICAL_SECTION*

Retrieves a CRITICAL_SECTION object.

operator CRITICAL_SECTION*();

Remarks

Call this function to retrieve a pointer to the internal CRITICAL_SECTION object.

CCriticalSection::Unlock

Releases the CCriticalSection object for use by another thread.

BOOL Unlock();

Return Value

Nonzero if the CCriticalSection object was owned by the thread and the release was successful; otherwise 0.

Remarks

If the CCriticalSection is being used stand-alone, Unlock must be called immediately after completing use of the resource controlled by the critical section. If a CSingleLock object is being used, CCriticalSection::Unlock will be called by the lock object's Unlock member function.

Example

See the example for CCriticalSection::Lock.

See also

CSyncObject Class

Hierarchy Chart

CMutex Class

Feedback

Was this page helpful?

Yes

No

Provide product feedback

|

Get help at Microsoft Q&A

Feedback

Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see: https://aka.ms/ContentUserFeedback.

Submit and view feedback for

This product

This page

View all page feedback

Additional resources

California Consumer Privacy Act (CCPA) Opt-Out Icon

Your Privacy Choices

Theme

Light

Dark

High contrast

Previous Versions

Blog

Contribute

Privacy

Terms of Use

Trademarks

© Microsoft 2024

Additional resources

In this article

California Consumer Privacy Act (CCPA) Opt-Out Icon

Your Privacy Choices

Theme

Light

Dark

High contrast

Previous Versions

Blog

Contribute

Privacy

Terms of Use

Trademarks

© Microsoft 2024

CCriticalSection_百度百科

ticalSection_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心收藏查看我的收藏0有用+10CCriticalSection播报讨论上传视频函数本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。外文名CCriticalSection所属学科信息技术功    能用于同步的对象类    别函数临界区在控制一次只有一个线程修改数据或其它的控制资源时非常有用。例如,在链表中增加一个结点就只允许一次一个线程进行。通过使用CCriticalSection对象来控制链表,就可以达到这个目的。在运行性能比较重要而且资源不会跨进程使用时,建议采用临界区代替信号灯。有关在MFC中使用信号灯的详细信息,请参阅CMutex。使用CCriticalSection对象之前,需要构造它。在构造函数返回后,就可以使用临界区了。在使用完之后要调用UnLock函数。存取由CCriticalSection控制的资源时,要在资源的存取函数中定义一个CSingleLock型的变量。然后调用加锁对象的Lock成员函数(如CSingleLock::Lock)。此时,调用的线程要么获得对资源的存取权,要么等待他人释放资源等待加锁,或者等待他人释放资源,但又因为超时而加锁失败。这样就保证了一次只有一个线程在存取临界资源。释放资源只需调用成员函数UnLock(例如CSingleLock::Unlock),或让锁对象在作用范围之外。此外,可以单独地建立一个CCriticalSection对象,并在存取临界资源之前显式地存取它。这种方式有助于保持代码的清晰,但是更容易出错,因为程序员要记住在存取临界资源前加锁,存取之后开锁。使用时必须包含头文件#include "afxmt.h"新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000

C++关于临界区CCriticalSection的线程同步 网狐框架示例 - 简书

于临界区CCriticalSection的线程同步 网狐框架示例 - 简书登录注册写文章首页下载APP会员IT技术C++关于临界区CCriticalSection的线程同步 网狐框架示例凉拌姨妈好吃关注赞赏支持C++关于临界区CCriticalSection的线程同步 网狐框架示例今天早上在gitbook上翻译了msdn文档里的Critical Section Objects,渣渣翻译。

1. 临界区

1.1临界区是什么

临界区与互斥量、事件、信号一样,都提供了一种同步机制。临界区在同一时间内仅能被一个线程所拥有,这对于保护共享资源不被并发访问非常有用。但是它只能在单进程中使用,无法跨进程共享。

1.1.1什么是同步,什么是异步?

同步和异步关注的是消息通信机制

以下的理解来自于知乎(愚抄 严肃 陈硕)

下面用两个例子来解释同步和异步:

当你用水壶烧一壶水,此时有两种水壶,一种是烧开不会响笛的水壶A,另一种是烧开会响笛的水壶B。

当你使用水壶A烧水的时候,你需要自己来看看水有没有烧开,这就是同步。

当你使用水壶B烧水的时候,水烧开了它自动就会通知你,这就是异步。

你打电话给书店老板,问有没有《C++ primer》这本书。

在同步机制里,老板会说“稍等,我找找”,然后就开始查找,等查好了就告诉你结果(返回结果)。

在异步机制里,老板会说“我去找一下,查到了再打电话给你”,然后直接挂掉电话(不返回结果),查好了他就主动打电话给你(相当于回调函数)。

需要注意的一个重点:在处理IO的时候,阻塞与非阻塞都是同步IO

同步与异步

1.2 如何使用临界区

当该临界区对象被某个线程占用时,另一个线程想要访问该对象,线程就会进入休眠状态,直到临界区对象被释放,才会唤醒该线程。

因为唤醒线程需要时间,所以现在为了避免性能降低。在另一个线程访问对象且该对象已被占用的时候,设置一个循环访问次数,在这个次数内不断循环访问临界区对象,如果该对象被释放,这个线程就不会进入休眠。如果该对象在循环次数内依旧没有释放,线程就会进入线程。

2. CCriticalSection(临界区)同步对象

2.1 关于CCriticalSection

CCriticalSection是MFC提供的一种同步对象。它是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。

2.2 CCriticalSection的用法

定义一个CCriticalSection类的全局对象,因为是全局对象,那么各个线程均可以访问。

在访问需要保护的资源或代码之前,调用CCriticalSection类的成员Lock()获得临界区对象。

在线程中调用该函数来使线程获得它所请求的临界区,如果此时没有其他线程占用临界区对象,则调用Lock(),线程获取临界区。否则,线程被挂起,并放入到一个系统队列中等待,直到当前拥有的线程释放了临界区为止。

访问临界区结束后,使用Unlock()来释放临界区。

2.3 CCriticalSection在网狐框架中的使用

它为CCriticalSection专门定义了一个新类CWHDataLocker,其中增加了锁定计数这个字段,在使用临界区的时候,不单单是锁定临界区,还会将锁定计数+1,在解锁的时候,会将锁定计数-1

//变量定义

private:

INT m_nLockCount; //锁定计数

CCriticalSection & m_CriticalSection; //锁定对象

//构造函数

CWHDataLocker::CWHDataLocker(CCriticalSection & CriticalSection, bool bLockAtOnce)

: m_CriticalSection(CriticalSection)

{

//设置变量

m_nLockCount=0;

//锁定对象

if (bLockAtOnce==true)

{

Lock();

}

return;

}

//析构函数

CWHDataLocker::~CWHDataLocker()

{

//解除锁定

while (m_nLockCount>0)

{

UnLock();

}

return;

}

//锁定函数

VOID CWHDataLocker::Lock()

{

//锁定对象

m_CriticalSection.Lock();

//设置变量

m_nLockCount++;

return;

}

//解锁函数

VOID CWHDataLocker::UnLock()

{

//效验状态

ASSERT(m_nLockCount>0);

if (m_nLockCount==0) return;

//设置变量

m_nLockCount--;

//解除锁定

m_CriticalSection.Unlock();

return;

}

在队列服务中,我们可以看到该类的使用,在队列中加入数据或者提取数据都使用了临界区。因为临界区在函数中实例化,所以在函数结束后会自动调用CWHDataLocker的析构函数解除临界区的锁定

//加入数据

bool CQueueService::AddToQueue(WORD wIdentifier,void *const pBuffer, WORD wDataSize)

{

CWHDataLocker lock(m_CriticalSection);//

m_DataQueue.InsertData(wIdentifier, pBuffer, wDataSize);

PostQueuedCompletionStatus(m_hCompletionPort, wDataSize, (ULONG_PTR)this, NULL);

return true;

}

//提取数据

bool CQueueService::GetData(tagDataHead & DataHead, void * pBuffer, WORD wBufferSize)

{

CWHDataLocker lock(m_CriticalSection);//

return m_DataQueue.DistillData(DataHead, pBuffer, wBufferSize);

}

网狐框架中大量使用了临界区:登录服务器、游戏服务器、定时器引擎、队列服务TCP引擎、异步引擎等等

©著作权归作者所有,转载或内容合作请联系作者 人面猴序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...沈念sama阅读 145,261评论 1赞 308死咒序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...沈念sama阅读 62,177评论 1赞 259救了他两次的神仙让他今天三更去死文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...开封第一讲书人阅读 96,329评论 0赞 214道士缉凶录:失踪的卖姜人 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...开封第一讲书人阅读 41,490评论 0赞 184港岛之恋(遗憾婚礼)正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...茶点故事阅读 49,353评论 1赞 262恶毒庶女顶嫁案:这布局不是一般人想出来的文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...开封第一讲书人阅读 39,028评论 1赞 179城市分裂传说那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...沈念sama阅读 30,611评论 2赞 276双鸳鸯连环套:你想象不到人心有多黑文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...开封第一讲书人阅读 29,383评论 0赞 171万荣杀人案实录序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...沈念sama阅读 32,749评论 0赞 215护林员之死正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...茶点故事阅读 29,460评论 2赞 219白月光启示录正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...茶点故事阅读 30,814评论 1赞 232活死人序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...沈念sama阅读 27,255评论 2赞 215日本核电站爆炸内幕正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...茶点故事阅读 31,752评论 3赞 214男人毒药:我在死后第九天来索命文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...开封第一讲书人阅读 25,685评论 0赞 9一桩弑父案,背后竟有这般阴谋文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...开封第一讲书人阅读 26,114评论 0赞 170情欲美人皮我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...沈念sama阅读 33,747评论 2赞 234代替公主和亲正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...茶点故事阅读 33,901评论 2赞 238推荐阅读更多精彩内容iOS 面试宝典 没有比这更全的了(持续更新)1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...欧辰_OSR阅读 28,941评论 8赞 265iOS - 关于线程同步引用自多线程编程指南应用程序里面多个线程的存在引发了多个执行线程安全访问资源的潜在问题。两个线程同时修改同一资源有...Mitchell阅读 1,918评论 1赞 7Java多线程进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...小徐andorid阅读 2,776评论 3赞 53如何设计并实现一个线程安全的 Map ?(下篇)在上篇中,我们已经讨论过如何去实现一个 Map 了,并且也讨论了诸多优化点。在下篇中,我们将继续讨论如何实现一个线...一缕殇流化隐半边冰霜阅读 7,526评论 5赞 41爱,从未离开早晨,一如既往挤上公交去上班,一如既往带着耳机听着歌,一如既往漠视窗外的人流,眼神无意中扫到公交移动电视,这一次不...乐自在小姐阅读 184评论 0赞 1评论0赞赞1赞赞赏更

CCriticalSection 類別 | Microsoft Learn

CCriticalSection 類別 | Microsoft Learn

跳到主要內容

已不再支援此瀏覽器。

請升級至 Microsoft Edge,以利用最新功能、安全性更新和技術支援。

下載 Microsoft Edge

Internet Explorer 和 Microsoft Edge 的詳細資訊

目錄

結束焦點模式

語言

閱讀英文

儲存

目錄

閱讀英文

儲存

列印

Twitter

LinkedIn

Facebook

電子郵件

目錄

CCriticalSection 類別

發行項

10/12/2023

8 位參與者

意見反應

本文內容

表示「重要區段」— 同步處理物件,一次允許一個執行緒存取程式碼的資源或區段。

語法

class CCriticalSection : public CSyncObject

成員

公用建構函式

名稱

描述

CCriticalSection::CCriticalSection

建構 CCriticalSection 物件。

公用方法

名稱

描述

CCriticalSection::Lock

使用 取得物件的存取 CCriticalSection 權。

CCriticalSection::Unlock

釋出 CCriticalSection 物件。

公用運算子

名稱

描述

CCriticalSection::operator CRITICAL_SECTION*

擷取內部 CRITICAL_SECTION 物件的指標。

公用資料成員

名稱

描述

CCriticalSection::m_sect

CRITICAL_SECTION 物件。

備註

當一次只允許一個執行緒修改資料或一些其他受控制的資源時,關鍵區段會很有用。 例如,將節點新增至連結清單是一個進程,一次只能由一個執行緒允許。 藉由使用 CCriticalSection 物件來控制連結清單,一次只能有一個執行緒取得清單的存取權。

注意

類別的功能 CCriticalSection 是由實際的 Win32 CRITICAL_SECTION 物件所提供。

當速度很重要,且資源不會跨進程界限使用時,會使用關鍵區段,而不是 Mutex。 CMutex

使用 物件的方法有兩種 CCriticalSection :獨立且內嵌在 類別中。

獨立方法 若要使用獨立 CCriticalSection 物件,請在需要時建構 CCriticalSection 物件。 從建構函式成功傳回之後,使用 對 Lock 的呼叫,明確鎖定 物件。 當您 Unlock 完成存取重要區段時呼叫 。 這個方法雖然對讀取原始程式碼的人員更清楚,但較容易發生錯誤,因為您必須記得在存取前後鎖定重要區段並解除鎖定。

較好的方法是使用 類別 CSingleLock 。 它也具有 Lock 和 Unlock 方法,但若發生例外狀況,您不需要擔心解除鎖定資源。

Embedded 方法 您也可以將 -type 資料成員新增 CCriticalSection 至 類別,並視需要鎖定資料成員,來與多個執行緒共用類別。

如需使用 CCriticalSection 物件的詳細資訊,請參閱多執行緒:如何使用同步處理類別一 文 。

繼承階層架構

CObject

CSyncObject

CCriticalSection

需求

標頭:afxmt.h

CCriticalSection::CCriticalSection

建構 CCriticalSection 物件。

CCriticalSection();

備註

若要存取或釋放 CCriticalSection 物件,請 CSingleLock 建立 物件並呼叫其 Lock 和 Unlock 成員函式。 CCriticalSection如果物件正在使用獨立物件,請呼叫其 Unlock 成員函式來釋放它。

如果建構函式無法配置必要的系統記憶體,系統會自動擲回記憶體例外狀況(類型 CMemoryException 為 )。

範例

請參閱 CCriticalSection::Lock 的 範例。

CCriticalSection::Lock

呼叫這個成員函式以取得重要區段物件的存取權。

BOOL Lock();

BOOL Lock(DWORD dwTimeout);

參數

dwTimeoutLock 忽略此參數值。

傳回值

如果函式成功,則為非零;否則為 0。

備註

Lock 是封鎖呼叫,在發出重要區段物件訊號後才會傳回 (變成可用)。

如果需要計時等候,您可以使用 CMutex 物件而非 CCriticalSection 物件。

如果 Lock 無法配置必要的系統記憶體,系統會自動擲回記憶體例外狀況(類型 CMemoryException 為 )。

範例

此範例示範巢狀重要區段方法,方法是使用共用 CCriticalSection 物件控制共用資源的存取權(靜態 _strShared 物件)。 函 SomeMethod 式示範以安全的方式更新共用資源。

//Definition of critical section class

class CMyCritSectClass

{

static CString _strShared; //shared resource

static CCriticalSection _critSect;

public:

CMyCritSectClass(void) {}

~CMyCritSectClass(void) {}

void SomeMethod(void); //locks, modifies, and unlocks shared resource

};

//Declaration of static members and SomeMethod

CString CMyCritSectClass::_strShared;

CCriticalSection CMyCritSectClass::_critSect;

void CMyCritSectClass::SomeMethod()

{

_critSect.Lock();

if (_strShared == "")

_strShared = "";

_critSect.Unlock();

}

CCriticalSection::m_sect

包含所有 CCriticalSection 方法所使用的重要區段物件。

CRITICAL_SECTION m_sect;

CCriticalSection::operator CRITICAL_SECTION*

擷取 CRITICAL_SECTION 物件。

operator CRITICAL_SECTION*();

備註

呼叫此函式以擷取內部 CRITICAL_SECTION 物件的指標。

CCriticalSection::Unlock

CCriticalSection釋放物件以供另一個執行緒使用。

BOOL Unlock();

傳回值

如果 CCriticalSection 物件是由執行緒所擁有且發行成功,則為非零,否則為 0。

備註

CCriticalSection如果要獨立使用 , Unlock 則必須在完成由重要區段控制的資源使用之後立即呼叫 。 如果使用物件 CSingleLock , CCriticalSection::Unlock 鎖定物件的 Unlock 成員函式將會呼叫 。

範例

請參閱 的 CCriticalSection::Lock 範例。

另請參閱

CSyncObject 類

階層架構圖表

CMutex 類

意見反應

此頁面對您有幫助嗎?

Yes

No

提供產品意見反應

|

在 Microsoft Q&A 上取得說明

意見反應

Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see: https://aka.ms/ContentUserFeedback.

提交並檢視相關的意見反應

本產品

本頁

檢視所有頁面意見反應

其他資源

加州消費者隱私權法案 (CCPA) 退出圖示

您的隱私權選擇

佈景主題

淺色

深色

高對比

舊版本

部落格

參與

隱私權

使用規定

商標

© Microsoft 2024

其他資源

本文內容

加州消費者隱私權法案 (CCPA) 退出圖示

您的隱私權選擇

佈景主題

淺色

深色

高對比

舊版本

部落格

參與

隱私權

使用規定

商標

© Microsoft 2024

临界段CCriticalSection的使用_ccriticalsection 定义临界区-CSDN博客

>

临界段CCriticalSection的使用_ccriticalsection 定义临界区-CSDN博客

临界段CCriticalSection的使用

最新推荐文章于 2018-08-01 22:08:12 发布

无幻

最新推荐文章于 2018-08-01 22:08:12 发布

阅读量1.6w

收藏

21

点赞数

3

分类专栏:

2.4 线程/图形学

文章标签:

mfc

thread

windows

文档

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/akof1314/article/details/5773076

版权

2.4 线程/图形学

专栏收录该内容

10 篇文章

4 订阅

订阅专栏

类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。临界区在控制一次只有一个线程修改数据或其它的控制资源时非常有用。例如,在链表中增加一个结点就只允许一次一个线程进行。通过使用CCriticalSection对象来控制链表,就可以达到这个目的。它就像是一把钥匙,哪个线程获得了它就获得了运行线程的权力,而把其他线程统统阻塞。CCriticalSection类的构造函数原型如下:

CCriticalSection() 

可以发现这个类的构造函数没有参数,所以创建一个CCriticalSection类的对象非常简单,只有如下即可:

CCriticalSection criticalSection; 

示例:使用临界段编写一个有两个线程的应用程序。1.创建单文档应用程序;2.在视图类的实现文件中定义一个临界段对象:

CCriticalSection criticalSection; 

3.在视图类的实现文件中定义两个线程函数:

UINT MessageThread1(LPVOID pParam) 

    criticalSection.Lock(); 

    LPTSTR pMessage = _T(

"Thread1 is started"); 

    CWnd *pMainWnd = AfxGetMainWnd(); 

    ::MessageBox(pMainWnd->m_hWnd, pMessage, _T(

"Thread message"), MB_OK); 

    criticalSection.Unlock(); 

    

return 

0; 

UINT MessageThread2(LPVOID pParam) 

    criticalSection.Lock(); 

    LPTSTR pMessage = _T(

"Thread2 is started"); 

    CWnd *pMainWnd = AfxGetMainWnd(); 

    ::MessageBox(pMainWnd->m_hWnd, pMessage, _T(

"Thread message"), MB_OK); 

    criticalSection.Unlock(); 

    

return 

0; 

4.在视图类鼠标左键消息函数编写如下:

void CThreadTestView::OnLButtonDown(UINT nFlags, CPoint point) 

    AfxBeginThread(MessageThread1, _T(

"Thread is started")); 

//启动线程1 

    AfxBeginThread(MessageThread2, _T(

"Thread is started")); 

//启动线程2 

    CView::OnLButtonDown(nFlags, point); 

运行结果如下:

参考资料:1.临界段类(CCriticalSection)——MFC http://blog.sina.com.cn/s/blog_627ebfc30100itd9.html2.《MFC Windows应用程序设计(第2版)》

优惠劵

无幻

关注

关注

3

点赞

21

收藏

觉得还不错?

一键收藏

知道了

3

评论

临界段CCriticalSection的使用

类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。临界区在控制一次只有一个线程修改数据或其它的控制资源时非常有用。

复制链接

扫一扫

专栏目录

如何使用CCriticalSection类

07-02

如何使用CCriticalSection类

如何使用CCriticalSection类

如何使用CCriticalSection类

CCriticalSection的使用

KFPA的博客

04-05

781

CCriticalSection是对关键段CRITICAL_SECTION的封装。

 

关键段(critival section)是一小段代码,他在执行之前需要独占对一些共享资源的访问权。这种方式可以让多行代码以“原子方式”来对资源进行操控。这里的“原子方式”,指的是代码知道除了当前线程之外没有其他任何线程会同时访问该资源。当然,系统仍然可以暂停当前线程去调度其他线程。但是,在当前线程离开关键

3 条评论

您还未登录,请先

登录

后发表或查看评论

CCriticalSection类的使用

枯荣

11-21

1572

当多个线程访问一个独占性共享资源时,可以使用“临界区”对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止,这样就保证了不会在同一时刻出现多个线程访问共享资源。

       CCriticalSection类的用法非常简单,步骤如下:

       定义CCrit

CCriticalSection

董盼山的专栏

08-15

9509

类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。临界区在控制一次只有一个线程修改数据或其它的控制资源时非常有用。例如,在链表中增加一个结点就只允许一次一个线程进行。通过使用CCriticalSection对象来控制链表,就可以达到这个目的。  

        在运行性能比较重要而且资源不会跨进程使用时,建议采用

MFC CCriticalSection 关键段例子

04-17

MFC CCriticalSection 关键段例子 使用多线程对关键段保护! 1 对vector 写入 线程 2 对vector 读出 线程

多线程临界段类同步演示1

02-18

多线程同步演示1,采用MFC的临界段类CCriticalSection来实现多线程同步。

CriticalSection.rar_CCriticalSection_CriticalSection

09-23

关于共享和临界的控制类(CCriticalSection)的应用。多线程小程序.

使用临界区线程同步示例代码VC源代码

03-15

本代码演示了利用临界区实现线程的同步。 关键字:CCriticalSection,临界区

MFC线程同步—— CCriticalSection类使用

剑若问天

11-15

3174

多个线程访问临界区时,可以使用临界区对象。临界区对象是一个独占性共享资源,任一时刻只有一个线程可以拥有临界区。拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止。

CCriticalSection类的用法:

方法一:

(1)定义CCriticalSection类的一个全局对象(以使各个线程均能访问):

VC6多线程编程

wmnmtm的专栏

08-05

500

  一、问题的提出编写一个耗时的单线程程序:   新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX_SECOND,标题为“延时6秒”,添加按钮的响应函数,代码如下: void CSingleThreadDlg::OnSleepSixSecond() {  Sleep(6000);...

线程同步 CCriticalSection(临界区类)

风言的专栏

09-07

1075


线程同步 CCriticalSection(临界区类)
 
当多个线程访问一个独占性共享资源时,可以使用“临界区”对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止,这样就保证了不会在同一时刻出现多个线程访问共享资源。
CCriticalSection类的用法如下:
 定义CCriticalSection类的一个全局对象(以使各个线程均

CRITICAL_SECTION的使用

u011370927的博客

08-01

2390

1、任何要访问共享资源的代码,都必须包含在EnterCriticalSection和LeaveCriticalSection之间。

2、CRITICAL_SECTION的成员不能用"."或"->"访问,只能通过WIN API访问。

3、CRITCAL_SECTION使用前要使用函数VOID WINAPI InitializeCriticalSection(__out LPCRITICAL...

CSemaphore,CMutex,CCriticalSection,和CEvent的使用心得

bodogbo11的专栏

10-24

1457

临界区(CCriticalSection):临界区是一种最简单的同步对象,它只可以在同一进程内部使用。它的作用是保证只有一个线程可以申请到该对象 

    互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通

CCriticalSection与CSingleLock

Gordennizaicunzai的博客

12-26

1712

CCriticalSection

An object of class CCriticalSection represents a “critical section” — a synchronization object that allows one thread at a time to access a resource or section of code. Critical se

MFC CCriticalSection 关键段

SelfImprovement

04-17

2067

和其他同步对象不同,除非有需要以外,关键区域工作在用户模式下。若一个线程想运行一个封装在关键区域中的代码,它首先做一个旋转封锁,然后等待特定的时间,它进入内核模式去等待关键区域。

实际上,关键区域持有一个旋转计数器和一个信号量,前者用于用户模式的等待,后者用于内核模式的等待(休眠态)。在Win32API中,有一个CRITICAL_SECTION结构体表示关键区域对象。在MFC中,有一个类CCri

CCriticalSection 在哪个.h头文件

最新发布

09-07

### 回答1:

CCriticalSection 是一种用于实现互斥访问的 MFC 类,它位于 MFC 头文件 "afxmt.h" 中。

你可以使用下面的代码来包含 "afxmt.h" 头文件:

```

#include

```

在使用 CCriticalSection 类之前,你需要先在代码中添加 MFC 的支持。

### 回答2:

CCriticalSection在afxmt.h头文件中。

CCriticalSection是MFC类库中的一个关键字,用于实现临界区代码的同步访问。临界区代码指的是多个线程同时访问的临界区域,为了保证数据的完整性和一致性,需要对这部分代码进行同步控制。

afxmt.h是MFC(Microsoft Foundation Classes)库中的一个头文件,包含了处理多线程同步问题的类和函数。其中就包括了定义CCriticalSection类的相关代码。

使用CCriticalSection类需要先包含afxmt.h头文件,然后在代码中声明一个CCriticalSection类型的对象。在临界区域的代码块中,通过调用CCriticalSection对象的成员函数来实现对临界区的同步访问操作。

CCriticalSection类提供了一些成员函数,如Lock()和Unlock(),用于对临界区进行加锁和解锁操作。Lock()函数用于将当前线程加入到临界区的访问队列中,如果临界区已经被其他线程占用,则当前线程将被阻塞。Unlock()函数用于释放当前线程对临界区的控制,以便其他线程可以进入临界区执行代码。

总之,CCriticalSection类是afxmt.h头文件中定义的,用于实现多线程同步访问临界区的关键字。

### 回答3:

CCriticalSection不是一个标准的C++头文件,它是MFC(Microsoft Foundation Classes)中的类库之一,用于实现线程同步。要使用CCriticalSection,需要包含"afxmt.h"头文件。

"afxmt.h"是一个MFC的多线程编程相关头文件,其中定义了许多用于线程同步的类和函数。在该头文件中,CCriticalSection类被定义用于实现临界区的同步。

临界区是一种保护共享资源的机制,用于控制多个线程对共享资源的访问。通过使用CCriticalSection类,可以确保同一时刻只有一个线程可以进入临界区,从而避免多个线程同时访问共享资源造成的数据竞争和不一致性。

在使用CCriticalSection前,需要先创建一个CCriticalSection对象,然后可以通过调用其成员函数来实现对临界区的加锁和解锁等操作。

总结起来,要使用CCriticalSection类,需要在代码中包含"afxmt.h"头文件。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

无幻

CSDN认证博客专家

CSDN认证企业博客

码龄15年

暂无认证

444

原创

1万+

周排名

48万+

总排名

480万+

访问

等级

4万+

积分

3535

粉丝

957

获赞

3495

评论

2082

收藏

私信

关注

热门文章

如何制作一个简单的游戏 Cocos2d-x 2.0.4

134468

CoolFormat源代码格式化工具

92643

Unity 脚本生命周期流程图

85044

Unity 4.3 制作一个2D横版射击游戏

83627

如何制作一个横版格斗过关游戏 Cocos2d-x 2.0.4

74813

分类专栏

1 ------基础知识------

1.1 C/C++

19篇

笔记

1.3 数据结构和算法

32篇

1.2 ACM/ICPC

70篇

1.4 C++标准和STL

5篇

2 ------VC 编程------

1篇

2.1 VC++/MFC

61篇

2.2 MFC9.0版本

17篇

2.3 VC技巧收集

31篇

2.4 线程/图形学

10篇

2.5 网络编程

7篇

2.6 第三方库

29篇

3 ------游戏编程------

3.1 Cocos2d-x

23篇

3.2 MyGui

5篇

3.3 Unity

98篇

4 ------软件方面------

4.1 软件应用

22篇

4.2 软件测试

2篇

4.3 软件作品

13篇

4.4 游戏作品

1篇

5 ------其他方面------

5.1 C#/.NET编程

13篇

5.2 Delphi编程

41篇

5.3 Lua编程

8篇

5.4 QT编程

5篇

5.5 SQL Server

6篇

5.6 Ubuntu初探

6篇

5.7 实用网站

8篇

最新评论

CoolFormat源代码格式化工具

OPEN-F:

您好,请问您还会进行这个项目的更新和维护吗?

Unity 精灵图集Shader渲染错乱

yeziiiiiiii:

UIVertex vert = new UIVertex(); 写在OnEnable里就行吧,不然调用次数太多了

用CImage类来显示PNG、JPG等图片

cherish_hao:

透明颜色设置为白色。那如果图片中含有白色部分,就会显示不全。

Unity TextMesh Pro 组件的 Resources 文件夹打包

CSDN-Ada助手:

哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)使用更多的站内链接;(2)使用标准目录;(3)增加除了各种控件外,文章正文的字数。

Unity AssetBundle 设置名称优化

天下湿湿:

老哥,不是说你写的不好,是想说你太懒

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

Unity Transform 检视器快速复制粘贴

Bugly 分配处理人时通知到其他IM

Unity DragonBones 龙骨隐藏指定插槽

2022年1篇

2021年9篇

2020年12篇

2019年13篇

2018年12篇

2017年13篇

2016年14篇

2015年15篇

2014年28篇

2013年25篇

2012年42篇

2011年66篇

2010年136篇

2009年151篇

目录

目录

分类专栏

1 ------基础知识------

1.1 C/C++

19篇

笔记

1.3 数据结构和算法

32篇

1.2 ACM/ICPC

70篇

1.4 C++标准和STL

5篇

2 ------VC 编程------

1篇

2.1 VC++/MFC

61篇

2.2 MFC9.0版本

17篇

2.3 VC技巧收集

31篇

2.4 线程/图形学

10篇

2.5 网络编程

7篇

2.6 第三方库

29篇

3 ------游戏编程------

3.1 Cocos2d-x

23篇

3.2 MyGui

5篇

3.3 Unity

98篇

4 ------软件方面------

4.1 软件应用

22篇

4.2 软件测试

2篇

4.3 软件作品

13篇

4.4 游戏作品

1篇

5 ------其他方面------

5.1 C#/.NET编程

13篇

5.2 Delphi编程

41篇

5.3 Lua编程

8篇

5.4 QT编程

5篇

5.5 SQL Server

6篇

5.6 Ubuntu初探

6篇

5.7 实用网站

8篇

目录

评论 3

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

CCriticalSection类的使用「建议收藏」-腾讯云开发者社区-腾讯云

ticalSection类的使用「建议收藏」-腾讯云开发者社区-腾讯云全栈程序员站长CCriticalSection类的使用「建议收藏」关注作者腾讯云开发者社区文档建议反馈控制台首页学习活动专区工具TVP最新优惠活动文章/答案/技术大牛搜索搜索关闭发布登录/注册首页学习活动专区工具TVP最新优惠活动返回腾讯云官网全栈程序员站长首页学习活动专区工具TVP最新优惠活动返回腾讯云官网社区首页 >专栏 >CCriticalSection类的使用「建议收藏」CCriticalSection类的使用「建议收藏」全栈程序员站长关注发布于 2022-09-09 09:27:093910发布于 2022-09-09 09:27:09举报文章被收录于专栏:全栈程序员必看全栈程序员必看大家好,又见面了,我是你们的朋友全栈君。 当多个线程访问一个独占性共享资源时,可以使用“临界区”对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止,这样就保证了不会在同一时刻出现多个线程访问共享资源。 CCriticalSection类的用法非常简单,步骤如下: 定义CCriticalSection类的一个全局对象(以使各个线程均能访问), 如 CCriticalSection critical_section; 在访问需要保护的资源或代码之前,调用CCriticalSection类的成员Lock()获得临界区对象: critical_section.Lock(); 在线程中调用该函数来使线程获得它所请求的临界区。如果此时没有其它线程占有临界区对象,则调用Lock()的线程获得临界区;否则,线程将被挂起,并放入到一个系统队列中等待,直到当前拥有临界区的线程释放了临界区时为止。 访问临界区完毕后,使用CCriticalSection的成员函数Unlock()来释放临界区: critical_section.Unlock(); 再通俗一点讲,就是线程A执行到critical_section.Lock(); 语句时,如果其它线程(B)正在执行critical_section.Lock(); 语句后且critical_section. Unlock(); 语句前的语句时,线程A就会等待,直到线程B执行完critical_section. Unlock(); 语句,线程A才会继续执行。 自己理解为:Lock()和unlock()之间使用的内存是受到保护的。 之前看的两个例子,一个是两个线程使用一个线程函数,函数内对同一变量赋值,锁定后,需要等待。 一个是两个线程使用不同的线程函数,两个函数中都对同一变量赋值,锁定后,需要等待。发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/162032.html原文链接:https://javaforall.cn本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。如有侵权请联系 cloudcommunity@tencent.com 删除前往查看httpsjava网络安全本文分享自 作者个人站点/博客 前往查看如有侵权,请联系 cloudcommunity@tencent.com 删除。本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!httpsjava网络安全评论登录后参与评论0 条评论热度最新登录 后参与评论推荐阅读LV.关注文章0获赞0领券社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于社区规范免责声明联系我们友情链接腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN加速视频通话图像分析MySQL 数据库SSL 证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569腾讯云计算(北京)有限责任公司 京ICP证150476号 |  京ICP备11018762号 | 京公网安备号11010802020287问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档Copyright © 2013 - 2024 Tencent Cloud.All Rights Reserved. 腾讯云 版权所有登录 后参与评论00

CCriticalSection的使用-腾讯云开发者社区-腾讯云

ticalSection的使用-腾讯云开发者社区-腾讯云全栈程序员站长CCriticalSection的使用关注作者腾讯云开发者社区文档建议反馈控制台首页学习活动专区工具TVP最新优惠活动文章/答案/技术大牛搜索搜索关闭发布登录/注册首页学习活动专区工具TVP最新优惠活动返回腾讯云官网全栈程序员站长首页学习活动专区工具TVP最新优惠活动返回腾讯云官网社区首页 >专栏 >CCriticalSection的使用CCriticalSection的使用全栈程序员站长关注发布于 2022-09-13 17:17:054070发布于 2022-09-13 17:17:05举报文章被收录于专栏:全栈程序员必看全栈程序员必看大家好,又见面了,我是你们的朋友全栈君。CCriticalSection是对关键段CRITICAL_SECTION的封装。

关键段(critival section)是一小段代码,他在执行之前需要独占对一些共享资源的访问权。这种方式可以让多行代码以“原子方式”来对资源进行操控。这里的“原子方式”,指的是代码知道除了当前线程之外没有其他任何线程会同时访问该资源。当然,系统仍然可以暂停当前线程去调度其他线程。但是,在当前线程离开关键段之前,系统是不会去调度任何想要访问同一资源的其他线程的。

例如:如果两个线程同时访问一个链表,一个线程可能会在另一个线程搜寻元素的同时向链表中添加一个元素,将导致搜索结果不正确;还有可能两个线程同时向链表中添加元素,这种情况会变的更加混乱;甚至一个线程搜索的时候,另一个线程删除了链表节点,将直接导致程序崩溃。

解决这个问题,我们可以先在代码中定义一个CRITICAL_SECTION数据结构m_sect,然后把任何需要访问共享资源的代码放在EnterCriticalSection和LeaveCriticalSection之间。

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

EnterCriticalSection(&m_sect);

// 共享资源的代码段….

LeaveCriticalSection(&m_sect); 一个 CRITICAL_SECTION结构就像是飞机上的一个卫生间,而马桶则是我们想要保护的资源(用EnterCriticalSection和LeaveCriticalSection组成的围墙包围住“马桶”)。由于卫生间很小,因此在同一时刻只允许一个人在卫生间内使用马桶(在同一时刻只允许一个线程在关键段中使用被保护资源)。

如果有多个总是应该在一起使用的资源,那么我们可以把他们放在同一个“卫生间”中:只需要创建一个CRITICAL_SECTION结构来保护所有这些资源。

关于关键段,需要掌握以下几点:

1、任何要访问共享资源的代码,都必须包含在EnterCriticalSection和LeaveCriticalSection之间。如果忘了哪怕是一个地方,共享资源就有可能被破坏。忘记调用EnterCriticalSection和LeaveCriticalSection,就好像是未经许可就强制进入卫生间一样,线程强行进入并对资源进行操控。只要有一个线程有这种粗暴的行为,资源就会被破坏。

2、关键段CRITICAL_SECTION是个未公开的结构,因为Microsoft认为开发人员不需要理解这个结构的细节。对我们来说,不需要知道这个结构中的成员变量,我们绝对不应该在编写代码的时候用到他的成员。

3、为了对CRITICAL_SECTION结构进行操控,我们必须调用Windows API函数,传入结构的地址。(注意是地址!)也就是说,如果该CRITICAL_SECTION结构生命周期没有结束,那么可以将该结构地址通过自己喜欢的任何方式传给任何线程。

4、在任何线程试图访问被保护的资源之前,必须对CRITICAL_SECTION结构的内部成员进程初始化。我们不知道内部成员,但可以调用Windows函数实现:VOID WINAPI InitializeCriticalSection(__out LPCRITICAL_SECTION lpCriticalSection);

5、当线程不再需要访问共享资源的时候,应调用下面的函数来清理该结构:VOID WINAPI DeleteCriticalSection(__inout LPCRITICAL_SECTION lpCriticalSection);

6、其实CRITICAL_SECTION并不知道什么是共享资源,也不会智能保护共享资源。其根本是,同一个时刻如果有多个线程调用EnterCriticalSection的时候,只有一个线程返回,其余线程则暂停执行,等待前面线程调用LeaveCriticalSection之后再执行。

7、可以看出,进入关键段是没有超时设定的,好像永远不会超时。实际上,对EnterCriticalSection的调用也会超时并引发异常。超时的时间长度由下面这个注册表子项中包含的CriticalSectionTimeout值决定:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager

这个值以秒为单位,他的默认值为2592000秒,大约30天。

8、同一个线程可以随便进入用一个关键段N次,也就是说同一个线程调用EnterCriticalSection无论几次都会返回。不同线程是否能够进入关键段,要看EnterCriticalSection的参数(CRITICAL_SECTION结构的地址)之前是否有线程进入过。要记住:飞机上的卫生间有多个,你可以随便进入无人的卫生间,不能进入有人的卫生间。

弄明白了CRITICAL_SECTION之后,使用CCriticalSection非常方便,如虎添翼。看代码:

//头文件

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

class CCriticalSection : public CSyncObjet

{…

public:

CRITICAL_SECTION m_sect;

public:

BOOL Unlock();

BOOL Lock();

BOOL Lock(DWORD dwTimeout);

}

// 构造函数

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

CCriticalSection::CCriticalSection() : CSyncObject(NULL)

{

HRESULT hr = S_OK;

if (!InitializeCriticalSectionAndSpinCount(&m_sect, 0))//可以理解为InitializeCriticalSection,为了效率,加了一个旋转锁。

{

hr = HRESULT_FROM_WIN32(GetLastError());

}

if (FAILED(hr))

{

AtlThrow(hr);

}

}

//进入关键段

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

BOOL CCriticalSection::Lock()

{

::EnterCriticalSection(&m_sect);

return TRUE;

} // 离开关键段

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

BOOL CCriticalSection::Unlock()

{

::LeaveCriticalSection(&m_sect);

return TRUE;

} // 析构

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

CCriticalSection::~CCriticalSection()

{

::DeleteCriticalSection(&m_sect);

} 是对关键段CRITICAL_SECTION的封装。

关键段(critival section)是一小段代码,他在执行之前需要独占对一些共享资源的访问权。这种方式可以让多行代码以“原子方式”来对资源进行操控。这里的“原子方式”,指的是代码知道除了当前线程之外没有其他任何线程会同时访问该资源。当然,系统仍然可以暂停当前线程去调度其他线程。但是,在当前线程离开关键段之前,系统是不会去调度任何想要访问同一资源的其他线程的。

例如:如果两个线程同时访问一个链表,一个线程可能会在另一个线程搜寻元素的同时向链表中添加一个元素,将导致搜索结果不正确;还有可能两个线程同时向链表中添加元素,这种情况会变的更加混乱;甚至一个线程搜索的时候,另一个线程删除了链表节点,将直接导致程序崩溃。

解决这个问题,我们可以先在代码中定义一个CRITICAL_SECTION数据结构m_sect,然后把任何需要访问共享资源的代码放在EnterCriticalSection和LeaveCriticalSection之间。

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

EnterCriticalSection(&m_sect);

// 共享资源的代码段….

LeaveCriticalSection(&m_sect); 一个 CRITICAL_SECTION结构就像是飞机上的一个卫生间,而马桶则是我们想要保护的资源(用EnterCriticalSection和LeaveCriticalSection组成的围墙包围住“马桶”)。由于卫生间很小,因此在同一时刻只允许一个人在卫生间内使用马桶(在同一时刻只允许一个线程在关键段中使用被保护资源)。

如果有多个总是应该在一起使用的资源,那么我们可以把他们放在同一个“卫生间”中:只需要创建一个CRITICAL_SECTION结构来保护所有这些资源。

关于关键段,需要掌握以下几点:

1、任何要访问共享资源的代码,都必须包含在EnterCriticalSection和LeaveCriticalSection之间。如果忘了哪怕是一个地方,共享资源就有可能被破坏。忘记调用EnterCriticalSection和LeaveCriticalSection,就好像是未经许可就强制进入卫生间一样,线程强行进入并对资源进行操控。只要有一个线程有这种粗暴的行为,资源就会被破坏。

2、关键段CRITICAL_SECTION是个未公开的结构,因为Microsoft认为开发人员不需要理解这个结构的细节。对我们来说,不需要知道这个结构中的成员变量,我们绝对不应该在编写代码的时候用到他的成员。

3、为了对CRITICAL_SECTION结构进行操控,我们必须调用Windows API函数,传入结构的地址。(注意是地址!)也就是说,如果该CRITICAL_SECTION结构生命周期没有结束,那么可以将该结构地址通过自己喜欢的任何方式传给任何线程。

4、在任何线程试图访问被保护的资源之前,必须对CRITICAL_SECTION结构的内部成员进程初始化。我们不知道内部成员,但可以调用Windows函数实现:VOID WINAPI InitializeCriticalSection(__out LPCRITICAL_SECTION lpCriticalSection);

5、当线程不再需要访问共享资源的时候,应调用下面的函数来清理该结构:VOID WINAPI DeleteCriticalSection(__inout LPCRITICAL_SECTION lpCriticalSection);

6、其实CRITICAL_SECTION并不知道什么是共享资源,也不会智能保护共享资源。其根本是,同一个时刻如果有多个线程调用EnterCriticalSection的时候,只有一个线程返回,其余线程则暂停执行,等待前面线程调用LeaveCriticalSection之后再执行。

7、可以看出,进入关键段是没有超时设定的,好像永远不会超时。实际上,对EnterCriticalSection的调用也会超时并引发异常。超时的时间长度由下面这个注册表子项中包含的CriticalSectionTimeout值决定:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager

这个值以秒为单位,他的默认值为2592000秒,大约30天。

8、同一个线程可以随便进入用一个关键段N次,也就是说同一个线程调用EnterCriticalSection无论几次都会返回。不同线程是否能够进入关键段,要看EnterCriticalSection的参数(CRITICAL_SECTION结构的地址)之前是否有线程进入过。要记住:飞机上的卫生间有多个,你可以随便进入无人的卫生间,不能进入有人的卫生间。

弄明白了CRITICAL_SECTION之后,使用CCriticalSection非常方便,如虎添翼。看代码:

//头文件

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

class CCriticalSection : public CSyncObjet

{…

public:

CRITICAL_SECTION m_sect;

public:

BOOL Unlock();

BOOL Lock();

BOOL Lock(DWORD dwTimeout);

}

// 构造函数

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

CCriticalSection::CCriticalSection() : CSyncObject(NULL)

{

HRESULT hr = S_OK;

if (!InitializeCriticalSectionAndSpinCount(&m_sect, 0))//可以理解为InitializeCriticalSection,为了效率,加了一个旋转锁。

{

hr = HRESULT_FROM_WIN32(GetLastError());

}

if (FAILED(hr))

{

AtlThrow(hr);

}

}

//进入关键段

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

BOOL CCriticalSection::Lock()

{

::EnterCriticalSection(&m_sect);

return TRUE;

} // 离开关键段

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

BOOL CCriticalSection::Unlock()

{

::LeaveCriticalSection(&m_sect);

return TRUE;

} // 析构

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

CCriticalSection::~CCriticalSection()

{

::DeleteCriticalSection(&m_sect);

} 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/162025.html原文链接:https://javaforall.cn本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。如有侵权请联系 cloudcommunity@tencent.com 删除前往查看数据分析c#数据结构编程算法本文分享自 作者个人站点/博客 前往查看如有侵权,请联系 cloudcommunity@tencent.com 删除。本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!数据分析c#数据结构编程算法评论登录后参与评论0 条评论热度最新登录 后参与评论推荐阅读LV.关注文章0获赞0领券社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于社区规范免责声明联系我们友情链接腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN加速视频通话图像分析MySQL 数据库SSL 证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569腾讯云计算(北京)有限责任公司 京ICP证150476号 |  京ICP备11018762号 | 京公网安备号11010802020287问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档Copyright © 2013 - 2024 Tencent Cloud.All Rights Reserved. 腾讯云 版权所有登录 后参与评论00

C++临界锁CCriticalSection在线程中的使用 - 知乎

C++临界锁CCriticalSection在线程中的使用 - 知乎首发于C++切换模式写文章登录/注册C++临界锁CCriticalSection在线程中的使用Reverse自由职业开发者,Linux爱好者,C,C++ ,C#开发者#define _AFXDLL

#include

#include

using namespace std;

CCriticalSection critical;

int tick=0;

DWORD WINAPI Func1(LPVOID lpParam);

DWORD __stdcall Func1(LPVOID lpParam)

{

critical.Lock();

tick += 10;

cout << "Func1 TICK NOW IS : " << tick << endl;

critical.Unlock();

return 0;

}

DWORD WINAPI Func2(LPVOID lpParam);

DWORD __stdcall Func2(LPVOID lpParam)

{

critical.Lock();

tick += 10;

cout << "Func2 TICK NOW IS : " << tick << endl;

critical.Unlock();

return 0;

}

int main()

{

HANDLE t1 = CreateThread(NULL, 0, Func1, NULL, 0, NULL);

HANDLE t2 = CreateThread(NULL, 0, Func2, NULL, 0, NULL);

while (true)

{

}

CloseHandle(t1);

CloseHandle(t2);

return 0;

}

发布于 2021-10-27 09:59Modern C++C / C++C++​赞同​​添加评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录C++C+