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