首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >每天学一点 — CCriticalSection临界区

每天学一点 — CCriticalSection临界区

作者头像
全栈程序员站长
发布于 2022-09-09 01:28:03
发布于 2022-09-09 01:28:03
8290
举报

大家好,又见面了,我是你们的朋友全栈君。

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

如此的话,每个线程共享一个CCriticalSection变量,只要CCriticalSection->lock和Unlock就能达到目的!

在一个函数内部,我们可以用一个局部变量的生存空间对应的构造和析构函数来自动调用CCriticalSection的功能,实在是妙极妙极!,如下代码:

–头文件–

//资源锁定 class COM_SERVICE_CLASS CThreadLock { //变量定义 private: INT m_nLockCount; //锁定计数 CCriticalSection & m_CriticalSection; //锁定对象

//函数定义 public: //构造函数 CThreadLock(CCriticalSection & CriticalSection, bool bLockAtOnce=true); //析构函数 virtual ~CThreadLock();

//操作函数 public: //锁定函数 VOID Lock(); //解锁函数 VOID UnLock();

//状态函数 public: //锁定次数 inline INT GetLockCount() { return m_nLockCount; } };

–cpp文件–

//构造函数 CThreadLock::CThreadLock(CCriticalSection & CriticalSection, bool bLockAtOnce) : m_CriticalSection(CriticalSection) { //设置变量 m_nLockCount=0;

//锁定对象 if (bLockAtOnce==true) { Lock(); }

return; }

//析构函数 CThreadLock::~CThreadLock() { //解除锁定 while (m_nLockCount>0) { UnLock(); }

return; }

//锁定函数 VOID CThreadLock::Lock() { //锁定对象 m_nLockCount++; m_CriticalSection.Lock();

return; }

//解锁函数 VOID CThreadLock::UnLock() { //效验状态 ASSERT(m_nLockCount>0); if (m_nLockCount==0) return;

//解除锁定 m_nLockCount–; m_CriticalSection.Unlock();

return; }

如果哪里要用到临界区,CThreadLock lock(m_CriticalSection);直接调用就可以了 ~~ 妙

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/162035.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[MFC]同步对象——CCriticalSection临界区,CSemaphore信号量
临界区是保证在某一个时间只有一个线程可以访问数据的方法。使用它的过程中,需要给每个线程提供一个共享的临界区对象,无论哪个线程占有临界区对象,都可以访问受到保护的数据,这时候其他的线程需要等待,直至该线程释放临界区对象为止,临界区被释放后,另外的线程可以强占这个临界区,以便访问共享的数据。
全栈程序员站长
2022/09/09
8300
[MFC]同步对象——CCriticalSection临界区,CSemaphore信号量
关键部分CCriticalSection使用
类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻仅仅同意一个线程存取资源或代码区。临界区在控制一次仅仅有一个线程改动数据或其他的控制资源时很实用。比如,在链表中添加一个结点就仅仅同意一次一个线程进行。通过使用CCriticalSection对象来控制链表,就能够达到这个目的。它就像是一把钥匙,哪个线程获得了它就获得了执行线程的权力,而把其他线程统统堵塞。 CCriticalSection类的构造函数原型例如以下:
全栈程序员站长
2022/09/09
4110
关键部分CCriticalSection使用
临界区、互斥量、信号量
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/article/details/53769365
大黄大黄大黄
2018/09/14
2.8K0
CCriticalSection类的使用「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。 当多个线程访问一个独占性共享资源时,可以使用“临界区”对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止,这样就保证了不会在同一时刻出现多个线程访问共享资源。
全栈程序员站长
2022/09/09
5490
CCriticalSection的使用
大家好,又见面了,我是你们的朋友全栈君。CCriticalSection是对关键段CRITICAL_SECTION的封装。 关键段(critival section)是一小段代码,他在执行之前需要独占对一些共享资源的访问权。这种方式可以让多行代码以“原子方式”来对资源进行操控。这里的“原子方式”,指的是代码知道除了当前线程之外没有其他任何线程会同时访问该资源。当然,系统仍然可以暂停当前线程去调度其他线程。但是,在当前线程离开关键段之前,系统是不会去调度任何想要访问同一资源的其他线程的。 例如:如果两
全栈程序员站长
2022/09/13
6130
支持定时任务的任务池
任务池可以用来异步处理任务,比如清理过期日志、HTTP请求,本文介绍的任务池还支持定时触发任务,在SetTimer得注意的两个坑 一文中介绍了工作线程如果想使用定时器需要有消息循环,有了本文介绍的任务池,工作线程可以将定时器的实现交给它。
gaigai
2019/08/29
8150
支持定时任务的任务池
critical临界的_临界区的定义
通俗解释就像上厕所: 门锁了,就等着,等到别人出来了,进去锁上,然后该干什么干什么,干完了,把门打开
全栈程序员站长
2022/11/08
5470
线程同步(互斥锁与信号量的作用与区别)以及临界区临街资源
临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。诸进程间采取互斥方式,实现对这种资源的共享。
zhangjiqun
2024/12/16
3670
线程同步(互斥锁与信号量的作用与区别)以及临界区临街资源
临界区 互斥量 事件 信号量_互斥信号量与同步信号量
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 3、信号量:为控制一个具有有限数量用户资源而设计。 4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
全栈程序员站长
2022/09/23
9270
【语言-C++】多线程通同步 临界区 CCriticalSection 与 CSingleLock
处理图像事件和显示图像事件同时发生时,激活图像处理线程,进行图像处理;接收图像事件的时间的触发由显示图像完成后触发;处理图像事件由相机线程图像传输来触发;
全栈程序员站长
2022/09/09
1K0
信号量与管程以及原子性,pv原语操作,临界资源和临界区,同步和互斥,信号量,管程与临界区不同,信号量和互斥锁的区别,互斥量(Mutex)
程序的原子性指:整个程序中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。
zhangjiqun
2024/12/16
3460
信号量与管程以及原子性,pv原语操作,临界资源和临界区,同步和互斥,信号量,管程与临界区不同,信号量和互斥锁的区别,互斥量(Mutex)
Vs下 CCriticalSection::Lock 异常错误的发生「建议收藏」
自己在vs下写了一个用 CCriticalSection::Lock来锁定对象的程序,发现给Lock设置dword参数时总会出现异常,后来查看了一下函数的文档,才恍然大悟!!!
全栈程序员站长
2022/09/09
9020
在MFC下面实际演示CCriticalSection 的使用
A:CCriticalSection是一种线程同步策略 或者说技术 或者方法 总之呢就是这么个意思。。。。
全栈程序员站长
2022/09/06
7120
在MFC下面实际演示CCriticalSection 的使用
资源竞速(Race Conditions)和临界区(Critical Sections)临界区临界区的资源竞速避免资源竞速临界区的吞吐量
critical section是每个线程中访问临界资源的那段代码,不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。 资源竞速就是可能在由于在访问临界区时没有互斥的访问而导致的特殊情况。
desperate633
2018/08/22
1.3K0
多线程编程10个例子--2
// TODO: Add extra initialization here m_ctrlProgress.SetRange(0,99); m_nMilliSecond=10; UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control } 添加线程处理函数: UINT ThreadFunc(LPVOID lpParam) { threadInfo* pInfo=(threadInfo*)lpPar
李海彬
2018/03/23
2.1K0
【Linux】多线程安全之道:互斥、加锁技术与底层原理
这是没有加锁(互斥)的代码执行的结果,发现我们抢票抢着抢着竟然抢到了负数!这是万万不行的。
用户11316056
2024/10/21
2020
【Linux】多线程安全之道:互斥、加锁技术与底层原理
C++11:多线程(1)
C++11现在也有了自己的多线程库,从C++11的线程库开始学习了解。 库主要分为:
何其不顾四月天
2023/03/10
5980
【Linux】线程互斥之线程加锁
线程加锁是在多线程编程环境中,为了确保在同一时刻只有一个线程能够访问特定的共享资源或执行特定的代码段,而采取的一种同步手段,通过在需要保护的资源或代码段前获取锁,在访问完成后释放锁,来实现对共享资源的互斥访问
s-little-monster
2025/04/18
2820
【Linux】线程互斥之线程加锁
【Linux】生产者消费者模型:基于阻塞队列和环形队列 | 单例模式线程池
当多线程并发执行并都需要访问临界资源时,因为每个线程都是不同的执行流,这就有可能导致数据不一致问题,为了避免此问题的发生,就需要对这块临界资源增加一些限制,一次只能有一个线程访问临界资源,即线程互斥。
aosei
2024/01/23
4130
【Linux】生产者消费者模型:基于阻塞队列和环形队列 | 单例模式线程池
windows 多线程_关于多线程的技术分享
本文内容较为详细,关于更简短的一篇介绍,请看这里: https://blog.csdn.net/weixin_45525272/article/details/105057120
全栈程序员站长
2022/09/23
7770
推荐阅读
相关推荐
[MFC]同步对象——CCriticalSection临界区,CSemaphore信号量
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档