临界区段

✍ dations ◷ 2025-12-04 22:16:41 #协同控制,程序架构

在同步的程序设计中,临界区段(Critical section)指的是一个访问共享资源(例如:共享设备或是共享存储器)的程序片段,而这些共享资源有无法同时被多个线程访问的特性。

当有线程进入临界区段时,其他线程或是行程必须等待(例如:bounded waiting 等待法),有一些同步的机制必须在临界区段的进入点与离开点实现,以确保这些共享资源是被异或的使用,例如:semaphore。

只能被单一线程访问的设备,例如:打印机。

一个最简单的实现方法就是当线程(Thread)进入临界区段时,禁止改变处理器;在uni-processor系统上,可以用“禁止中断(CLI)”来完成,避免发生系统调用(System Call)导致的上下文交换(Context switching);当离开临界区段时,处理器回复原先的状态。

在Windows操作系统,CRITICAL_SECTION是一种同步对象类型,用于同一个进程内的多线程同步访问资源。如果是跨进程同步,需要使用互斥锁(mutex)。

临界区对象首先需要初始化,通过调用操作系统API函数InitializeCriticalSection。各个线程调用函数 EnterCriticalSection, TryEnterCriticalSection, 或LeaveCriticalSection来使用临界区。使用结束后或者重初始化临界区之前,需要调用 DeleteCriticalSection 。

WINNT.H中定义的临界区数据结构如下:

struct RTL_CRITICAL_SECTION{   PRTL_CRITICAL_SECTION_DEBUG DebugInfo;   LONG LockCount;   LONG RecursionCount;   HANDLE OwningThread;   HANDLE LockSemaphore;   ULONG_PTR SpinCount;};

结构的各域的解释:

RTL_CRITICAL_SECTION_DEBUG结构如下:struct _RTL_CRITICAL_SECTION_DEBUG{

   WORD   Type;   WORD   CreatorBackTraceIndex;   RTL_CRITICAL_SECTION *CriticalSection;   LIST_ENTRY ProcessLocksList;   DWORD EntryCount;   DWORD ContentionCount;   DWORD Spare;

}结构的各域的解释:

MSDN Library -- Critical section

相关

  • 过敏性鼻炎过敏性鼻炎,又称为鼻敏感、干草热、花粉热、花粉症或季节性过敏性鼻炎,是因为免疫系统受到空气中的过敏原影响而导致的鼻炎症状。征兆和病症包括流鼻涕或鼻塞、打喷嚏、眼睛的
  • 污垢污垢是一种不干净的物质,特别指代某人肮脏的衣服、皮肤或者物品中的物质。常见的污垢类型包括:
  • 猿是灵长目人猿总科(学名:Hominoidea)动物的通称,包括两个科。虽然人们常把猿猴并称,有时候将猴也称为猿,而猿有时也会称做是猴,不过他们在生物学上是不同的动物。两者的主要区别在
  • 灵性灵性,综合学术与宗教解释为“个人在各种相处关系中达到平衡的最佳状态”,类似儒学《易传》、《中庸》所说的感通、中和(和谐)、诚等身心状态。而这些周遭关系包含了本身个体、自
  • 非侵入性胎儿染色体基因检测非侵入性胎儿染色体基因检测(英语:Non-Invasive Fetal Trisomy Test,缩写:NIFTY 或英语:Non-Invasive Prenatal Test,缩写:NIPT)是一种崭新的产前检查技术,不需要透过高侵入性的羊膜
  • 氪气3d10 4s2 4p62, 8, 18, 8蒸气压第一:1350.8 kJ·mol−1 第二:2350.4 kJ·mol−1 第三:3565 kJ·mol主条目:氪的同位素氪是一种化学元素,化学符号是Kr,原子序数是36,是一种无色
  • span class=nowrapAgMnOsub4/sub/span高锰酸银是一种无机化合物,化学式为AgMnO4。它是一种紫色晶体,属于单斜晶系。它受热分解,遇水缓慢分解,加强热可能爆炸。它可由硝酸银与高锰酸钾反应制得:
  • 苯甲酸铵苯甲酸铵(Ammonium benzoate),化学式为NH4C7H5O2,可溶于水,醇及甘油。可作化学分析试剂、生产电解电容及医药品。
  • 陈浩亮陈浩亮(1933年5月5日-)出生于汕头,新加坡举重运动员,也是2008年北京奥运会之前唯一为新加坡夺得奥运会奖牌的运动员。1960年9月9日,陈浩亮于罗马夏季奥林匹克运动会上,以380公斤总
  • 阿尔瓦罗·库尼亚尔阿尔瓦罗·巴雷里尼亚斯·库尼亚尔(葡萄牙语:Álvaro Barreirinhas Cunhal;葡萄牙语发音:.mw-parser-output .IPA{font-family:"Charis SIL","Doulos SIL","Linux Libertine","S