信号量

✍ dations ◷ 2025-08-02 02:26:25 #电脑术语,协同控制,荷兰发明

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

相关

  • 外层电子层,或称电子壳或电子壳层,是原子物理学中,一组拥有相同主量子数n的原子轨道。电子层组成为一粒原子的电子序。这可以证明电子层可容纳最多电子的数量为
  • 平滑肌肉瘤平滑肌肉瘤(Leiomyosarcoma, LMS),是一类病发于平滑肌肉的恶性肿瘤。平滑肌肉瘤是一类非常罕见的癌症,它占全部软组织肉瘤的5%至10%。平滑肌肉瘤很难被预测,它可能潜伏非常长时间
  • 龙神龙神可以指:
  • V07A·B·C·D·G·H·QI·J·L·M·N·P·R·S·VATC代码V07(其它所有的非治疗用品)是解剖学治疗学及化学分类系统的一个药物分组,这是由世界卫生组织药物统计方法整合中心(The WH
  • 网络中心战网络中心战(英语:Network-centric warfare,NCW),现多称网络中心行动(network-centric operations,NCO)是一种美国国防部所创的新军事指导原则,以求化信息优势为战争优势。其做法是用
  • 卵泡膜细胞瘤卵泡膜细胞瘤(英语:Thecomas, theca cell tumors)是一种良性的卵巢肿瘤,其仅由卵泡膜细胞(英语:theca cell)组成。组织学上它隶属于性腺间质肿瘤。此类疾病是典型的雌性激素引起,并
  • 秸秆.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:
  • 南城县南城县是中国江西省抚州市所辖的一个县。总面积为1698平方公里,2010年人口为32.6万。汉高祖五年(公元前202年)置县。 北宋太平兴国三年(978年)设建昌军,治南城。 明洪武二年(1369年
  • ISO 3166ISO 3166是国际标准化组织(ISO)针对国家、地区、具特殊科学价值地点,以及其子行政区(如:省或州)名称的国际标准代码。该标准正式英文全称为:“Codes for the representation of nam
  • 卡利亚夸卡利亚夸(Calliaqua)是加勒比海岛国圣文森特和格林纳丁斯圣文森特岛圣乔治区的一个城镇,位于该岛南海岸,靠近该岛最南点。为当地鱼市场、当地篮球场、体育场以及餐馆和酒吧的所