Windows线程同步——临界区对象

本文详细介绍了Windows线程同步中的临界区对象,包括其概述、实现原理和注意事项。临界区提供了一种轻量级的同步机制,允许在同一进程中互斥访问共享资源。在实现原理部分,探讨了底层API、自旋锁以及在不同CPU数量下的行为。文章还提供了代码示例,展示了临界区的使用及其效果。
摘要由CSDN通过智能技术生成

1. 概述

如果有多个线程试图同时访问临界区,那么在有一个线程进入临界区后,其他试图访问的线程将被挂起(经过自旋之后还没启用的话),直到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到对临界区的互斥访问。(临界区中一般都是一个简短的代码段)在WINDOWS中,临界区是一种应用层的同步对象,非内核对象。对于这句话的解释是这样的:临界区(Critical Section)是Win32中提供的一种轻量级的同步机制,与互斥(Mutex)和事件(Event)等内核同步对象相比,临界区是完全在用户态维护的,所以仅能在同一进程内供线程同步使用,但也因此无需在使用时进行用户态和核心态之间的切换,工作效率大大高于其它同步机制。对于用户线程和内核线程的相关解释已经在这篇博客中进行了说明。

2. 临界区实现原理

2.1 底层原理

首先来看一下使用到的临界区API,使用到的为下面四个函数

InitializeCriticalSection()	//初始化临界区
DeleteCriticalSection()	//删除临界区
EnterCriticalSection()	//进入临界区
LeaveCriticalSection()	//离开临界区
在临界区的实现过程中,涉及到一个叫RTL_CRITICAL_SECTION的结构体,它的定义是这样的

typedef struct _RTL_CRITICAL_SECTION {
    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
    //
    //  The following three fields control entering and exitin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值