信号量

✍ dations ◷ 2025-07-11 07:34:40 #电脑术语,协同控制,荷兰发明

信号量(英语:semaphore)又称为信号标,是一个同步对象,用于保持在0至指定最大值之间的一个计数值。当线程完成一次对该semaphore对象的等待(wait)时,该计数值减一;当线程完成一次对semaphore对象的释放(release)时,计数值加一。当计数值为0,则线程等待该semaphore对象不再能成功直至该semaphore对象变成signaled状态。semaphore对象的计数值大于0,为signaled状态;计数值等于0,为nonsignaled状态.

semaphore对象适用于控制一个仅支持有限个用户的共享资源,是一种不需要使用忙碌等待(busy waiting)的方法。

信号量的概念是由荷兰计算机科学家艾兹赫尔·戴克斯特拉(Edsger W. Dijkstra)发明的,广泛的应用于不同的操作系统中。在系统中,给予每一个进程一个信号量,代表每个进程目前的状态,未得到控制权的进程会在特定地方被强迫停下来,等待可以继续进行的信号到来。如果信号量是一个任意的整数,通常被称为计数信号量(Counting semaphore),或一般信号量(general semaphore);如果信号量只有二进制的0或1,称为二进制信号量(binary semaphore)。在linux系统中,二进制信号量(binary semaphore)又称互斥锁(Mutex)。

计数信号量具备两种操作动作,称为V(signal())与P(wait())(即部分参考书常称的“PV操作”)。V操作会增加信号标S的数值,P操作会减少它。

运作方式:

线程使用CreateSemaphore或CreateSemaphoreEx函数创建一个semaphore对象。此时可以指定semaphore的当前计数值与计数值上限;也可指定semaphore对象的名字。其他进程中的线程可以指出已存在的semaphore对象的名字通过调用OpenSemaphore函数打开它。

如果多个线程在等待一个semaphore对象,不保证按照先进先出(FIFO)顺序调度这些等待线程。外部事件,如内核模式的异步过程调用可改变等待顺序。

在semaphore对象为signaled状态时,等待函数返回会把该semaphore对象计数值减1。函数ReleaseSemaphore把semaphore对象的计数值增加指定的值。任何线程,哪怕它没有等待完成过该semaphore对象,也可以使用ReleaseSemaphore来增加semaphore对象的计数。如果ReleaseSemaphore导致对象计数值超过上限,则该函数调用失败,返回298号错误:“Too many posts were made to a semaphore”。

一个线程多次等待同一个semaphore对象,每次等待操作完成都会降低semaphore对象计数值(直至计数值为0时该线程阻塞)。然而,通过multiple-object等待函数使用一个数组包含着同一个semaphore对象的多个句柄,不能实现对这个semaphore对象计数值的多次下降。

用完semaphore对象后,调用CloseHandle函数关闭它。semaphore对象的最后一个句柄被关闭后,操作系统会摧毁它。关闭semaphore并不影响它的计数值。因此,关闭semaphore前或者进程终止前,要确保已经正确调用过ReleaseSemaphore。否则,挂起等待该semaphore对象的线程会永久阻塞或超时返回。

相关

  • 教宗国教宗国(拉丁语:Civitas Ecclesiae;意大利语:Stato Pontificio、Stato della Chiesa;又译为教皇国、教皇领)是南欧一个已经不存在的国家,为教宗统治的世俗领地,建立于8世纪,位于亚平宁
  • 光线光通常指的是人类眼睛可以见的电磁波(可见光),视知觉就是对于可见光的知觉。可见光只是电磁波谱上的某一段频谱,一般是定义为波长介于400至700奈(纳)米(nm)之间的电磁波,也就是波长比
  • 硫气孔火山喷气孔(英语:fumarole)是一种地壳裂缝,通常出现于火山附近。火山喷气孔会喷发蒸气及各种气体,如二氧化硫、盐酸和硫化氢,其中喷发硫化物质的,则被称为硫气孔。火山喷气孔会由许
  • 法式咸派法式咸派(法语:quiche)又称洛林乡村咸派、洛林咸派或简译作蛋批,是以鸡蛋揉合牛奶或鲜奶油制成的糕点,为法国传统炉烤佳肴。它的派皮通常先经盲烤,再加入其他食材。熟煮的碎肉、蔬
  • 德鲁兹教阿拉伯语 希伯来语 (以色列) 英语 (美国和澳大利亚)德鲁兹派(阿拉伯语:الدرزية‎),是中东的一个源自于伊斯兰教什叶派伊斯玛仪派的独立宗教教派,德鲁兹派的教义受到基督教和
  • 就业雇佣(英语:employment,意近:就业)是指二个伙伴之间的契约关系,其中一方为雇佣者(雇主、雇佣人),另一方为被雇佣者(雇员)。从法律意义来看,通过双方契约约定,“被雇佣者”为“雇佣者”工作
  • 一条叫旺达的鱼《一条叫旺达的鱼》(英语:A Fish Called Wanda),是上映于1988年的英美犯罪喜剧电影。该片具有浓烈的英式幽默元素。在英国伦敦George Thomason和他的酷爱动物的口吃助手Ken Pile
  • 杂谷杂谷(millets)是指一些具有小粒种子的谷类作物,在全世界广泛种植作为粮食与饲料. 它们并不是生物学分类概念,而是农学分类。它们的共同之处是属于禾本科(有个别例外)、种子小、
  • 薮猫属薮猫(学名:Leptailurus serval)是产于非洲的中型猫科动物,为薮猫属的唯一成员。薮猫体长85厘米,尾长40厘米。平均寿命在12-20年。与其他猫科动物相比,它体型修长,腿长而尾短,耳朵又
  • 乔姆斯基谱系乔姆斯基体系是计算机科学中刻画形式文法表达能力的一个分类谱系,是由诺姆·乔姆斯基于1956年提出的。它包括四个层次:正则语言类包含于上下文无关语言类,上下文无关语言类包含