信号量

✍ dations ◷ 2025-12-02 09:22:56 #电脑术语,协同控制,荷兰发明

信号量(英语: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对象的线程会永久阻塞或超时返回。

相关

  • 沙漠之狐安东尼·津尼 比尔·克林顿沙漠之狐行动(英语:Operation Desert Fox),是美、英两国于当地时间1998年12月17日凌晨1时到1998年12月20日凌晨4时50分,针对伊拉克发动的一场大规模的
  • 分居协议分居协议,或称为合法分居,是法律上的正式分居程序,但两人的婚姻关系仍然维持。分居协议可由法庭判令或经双方协议(视各国法律规定而异)。若关系中牵涉子女,分居协议亦会对子女的
  • 淬火.mw-parser-output ruby.zy{text-align:justify;text-justify:none}.mw-parser-output ruby.zy>rp{user-select:none}.mw-parser-output ruby.zy>rt{font-feature-settings:
  • 霍顿汽车霍顿汽车(英语:GM Holden Ltd),是一家澳大利亚的汽车制造厂商,总部位于澳大利亚维多利亚州墨尔本。霍顿汽车是由James Alexander Holden于1856年创立。当时公司纯粹生产马鞍。随
  • 裁判员制度所谓裁判员制度(日语:裁判員制度/さいばんいんせいど),是指在每场特定的刑事审判中,由选民(市民)当中选出的裁判员与法官共同参与审理的日本的司法、审判制度。关于本制度的设计,是由
  • 梅文鼎梅文鼎(1633年-1721年),字定九,号勿庵,安徽宣城人。清初天文学家、数学家、历算学家,被誉为“历算第一名家”。梅文鼎一生博览群书,著述80余种。早年,梅文鼎随其父梅士昌读《周易》,在
  • 小雨蛙Microhyla eremita Barbour, 1920小雨蛙(学名:Microhyla fissipes)为姬蛙科姬蛙属的两栖动物,分布范围从中国南部和中部到马来半岛和台湾. 以往与南亚的饰纹姬蛙(Microhyla ornat
  • 纳粹主义纳粹主义(“纳粹”音译自 Nazi,本身是缩写,来自德语的“国家民族社会主义”:),指1933年至1945年间统治德国的独裁政治,即“德意志第三帝国”。“纳粹”这个词在德语中的含义并不具
  • 红麹酒红麹酒,是一种以红麹米和糯米为主要原料酿制成的粮食酒,为中国特产。红麹米虽然具备一定的糖化和发酵能力,却不足以单独产出高浓度的酒,因此自古以来,红麹酒需另加酒曲来拟补。把
  • 总线竞争总线竞争(Bus contention)也称总线争用,是计算机设计中总线的不良状态——总线上的多个设备同时尝试在总线上放置值。大多数总线架构要求其设备遵循精心设计的仲裁协议,以使竞争