Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CCriticalSection类的使用「建议收藏」

CCriticalSection类的使用「建议收藏」

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

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

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 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
CCriticalSection的使用
大家好,又见面了,我是你们的朋友全栈君。CCriticalSection是对关键段CRITICAL_SECTION的封装。 关键段(critival section)是一小段代码,他在执行之前需要独占对一些共享资源的访问权。这种方式可以让多行代码以“原子方式”来对资源进行操控。这里的“原子方式”,指的是代码知道除了当前线程之外没有其他任何线程会同时访问该资源。当然,系统仍然可以暂停当前线程去调度其他线程。但是,在当前线程离开关键段之前,系统是不会去调度任何想要访问同一资源的其他线程的。 例如:如果两
全栈程序员站长
2022/09/13
6140
线程锁EnterCriticalSection和LeaveCriticalSection的用法
线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的用法
全栈程序员站长
2022/09/29
6480
【多线程】三、线程互斥 && 互斥量操作 && 守卫锁 && 重入与线程安全
​ 线程互斥(Thread Mutex)是指在多线程并发执行的程序中,为了避免多个线程同时访问临界区(Critical Section)而采用的一种同步机制。临界区是指对共享资源进行访问的代码段(也可以参考上面的概念),例如对共享变量的读写操作等。
利刃大大
2025/05/22
1490
【多线程】三、线程互斥 && 互斥量操作 && 守卫锁 && 重入与线程安全
CriticalSection_introducing critical thinking
WINBASEAPI VOID WINAPI EnterCriticalSection( __inout LPCRITICAL_SECTION lpCriticalSection ); 是多线程中用来确保同一时刻只有一个线程操作被保护的数据的操作函数,相关的多线程数据操作函数还有:
全栈程序员站长
2022/11/08
2340
临界区 互斥量 事件 信号量_互斥信号量与同步信号量
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 3、信号量:为控制一个具有有限数量用户资源而设计。 4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
全栈程序员站长
2022/09/23
9330
leavecriticalsection报错_sequence的用法
线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的用法
全栈程序员站长
2022/11/05
3920
windows 多线程_关于多线程的技术分享
本文内容较为详细,关于更简短的一篇介绍,请看这里: https://blog.csdn.net/weixin_45525272/article/details/105057120
全栈程序员站长
2022/09/23
7840
[MFC]同步对象——CCriticalSection临界区,CSemaphore信号量
临界区是保证在某一个时间只有一个线程可以访问数据的方法。使用它的过程中,需要给每个线程提供一个共享的临界区对象,无论哪个线程占有临界区对象,都可以访问受到保护的数据,这时候其他的线程需要等待,直至该线程释放临界区对象为止,临界区被释放后,另外的线程可以强占这个临界区,以便访问共享的数据。
全栈程序员站长
2022/09/09
8360
[MFC]同步对象——CCriticalSection临界区,CSemaphore信号量
临界区、互斥量、信号量
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/article/details/53769365
大黄大黄大黄
2018/09/14
2.8K0
每天学一点 — CCriticalSection临界区
(转)类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。临界区在控制一次只有一个线程修改数据或其它的控制资源时非常有用。例如,在链表中增加一个结点就只允许一次一个线程进行。通过使用CCriticalSection对象来控制链表,就可以达到这个目的。它就像是一把钥匙,哪个线程获得了它就获得了运行线程的权力,而把其他线程统统阻塞。
全栈程序员站长
2022/09/09
8340
Go 语言并发编程系列(十)—— sync 包系列:互斥锁和读写锁
我们前面反复强调,在 Go 语言并发编程中,倡导「使用通信共享内存,不要使用共享内存通信」,而这个通信的媒介就是我们前面花大量篇幅介绍的通道(Channel),通道是线程安全的,不需要考虑数据冲突问题,面对并发问题,我们始终应该优先考虑使用通道,它是 first class 级别的,但是纵使有主角光环加持,通道也不是万能的,它也需要配角,这也是共享内存存在的价值,其他语言中主流的并发编程都是通过共享内存实现的,共享内存必然涉及并发过程中的共享数据冲突问题,而为了解决数据冲突问题,Go 语言沿袭了传统的并发编程解决方案 —— 锁机制,这些锁都位于 sync 包中。
学院君
2019/09/10
9320
CriticalSection_protection initialization
如果EnterCriticalSection将一个线程置于等待状态,那么该线程在很长时间内就不能再次被调度。实际上,在编写得不好的应用程序中,该线程永远不会再次被赋予CPU时间。TryEnterCriticalSection函数决不允许调用线程进入等待状态。它的返回值能够指明调用线程是否能够获得对资源的访问权。TryEnterCriticalSection发现该资源已经被另一个线程访问,它就返回FALSE。在其他所有情况下,它均返回TRUE。运用这个函数,线程能够迅速查看它是否可以访问某个共享资源,如果不能访问,那么它可以继续执行某些其他操作,而不必进行等待。如果TryEnterCriticalSection函数确实返回了TRUE,那么CRITICAL_SECTION的成员变量已经更新。Windows98没有可以使用的TryEnterCriticalSection函数的实现代码。
全栈程序员站长
2022/11/06
2220
Go语言核心36讲(Go语言实战与应用四)--学习笔记
从本篇文章开始,我们将一起探讨 Go 语言自带标准库中一些比较核心的代码包。这会涉及这些代码包的标准用法、使用禁忌、背后原理以及周边的知识。
郑子铭
2021/11/14
3460
Go语言核心36讲(Go语言实战与应用四)--学习笔记
多线程CreateThread函数的用法
第一个参数是指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL。 第二个参数是用于新线程的初始堆栈大小,默认值为0。在任何情况下,Windows根据需要动态延长堆栈的大小。 第三个参数是指向线程函数的指标。函数名称没有限制,但是必须以下列形式声明: DWORD WINAPI ThreadProc (PVOID pParam) ; 第四个参数为传递给ThreadProc的参数。这样主线程和从属线程就可以共享数据。 第五个参数通常为0,但当建立的线程不马上执行时为旗标CREATE_SUSPENDED。线程将暂停直到呼叫ResumeThread来恢复线程的执行为止。表示创建线程的运行状态,其中CREATE_SUSPEND表示挂起当前创建的线程,而0表示立即执行当前创建的进程; 第六个参数 lpThreadID:返回新创建的线程的ID编号;是一个指标,指向接受执行绪ID值的变量。
全栈程序员站长
2022/09/06
6660
9.2 运用API实现线程同步
Windows 线程同步是指多个线程一同访问共享资源时,为了避免资源的并发访问导致数据的不一致或程序崩溃等问题,需要对线程的访问进行协同和控制,以保证程序的正确性和稳定性。Windows提供了多种线程同步机制,以适应不同的并发编程场景。主要包括以下几种:
王 瑞
2023/10/02
4000
9.2 运用API实现线程同步
critical临界的_临界区的定义
通俗解释就像上厕所: 门锁了,就等着,等到别人出来了,进去锁上,然后该干什么干什么,干完了,把门打开
全栈程序员站长
2022/11/08
5500
译文《Java并发编程之CAS》
CAS (compare and swap) 是并发算法设计时使用的一种技术。基本上,CAS是将变量的值与期望值进行比较,如果值相等,则将变量的值交换设置为新值。CAS可能听起来有点复杂,但一旦你理解它实际上相当简单,所以让我进一步详细说明这个主题。
潘潘和他的朋友们
2022/03/15
4740
译文《Java并发编程之CAS》
多线程编程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
MFC多线程
当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力。用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义。现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的。因此掌握多线程多任务设计方法对每个程序员都是必需要掌握的。本实例针对多线程技术在应用中经常遇到的问题,如线程间的通信、同步等,分别进行探讨,并利用多线程技术进行
拾点阳光
2018/05/10
2.7K0
Windows编程(多线程)
CreateThread是一种微软在Windows API中提供了建立新的线程的函数,该函数在主线程的基础上创建一个新线程。线程终止运行后,线程对象仍然在系统中,必须通过CloseHandle函数来关闭该线程对象。
全栈程序员站长
2022/07/13
1.3K0
相关推荐
CCriticalSection的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档