信号量

✍ dations ◷ 2025-11-02 10:13:16 #电脑术语,协同控制,荷兰发明

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

相关

  • 利宾纳利宾纳(Ribena) 是一种源自英国的饮品,由布里斯托大学科学家Vernon Charley于1933年首次调制,当时是为了研发一种用水果制造的糖浆,选用了在英国容易大量种植的黑加仑子作为原料
  • 时频谱时频谱(英语:Spectrogram)也称谱瀑布(spectral waterfall)、声指纹(voiceprint)、声图(voicegram)或声谱图,是一种描述波动的各频率成分如何随时间变化的热图(英语:Heat map)。利用傅里叶
  • 华中科技大学同济医学院华中科技大学同济医学院,其前身为德国医生宝隆博士于1907年创建的上海德文医学堂,后发展成为国立同济大学医学院。1951年因全国高校院系调整,同济大学医学院从上海迁至武汉,与武
  • 杜瓦苯杜瓦苯(英语:Dewar Benzene)是苯的价键异构体之一。其标准命名为:双环己-2,5-二烯,为英国化学家詹姆斯·杜瓦(James Dewar)于1867年提出的苯的可能结构,故命名为“杜瓦苯”。在0℃吡
  • 传导性听力损失感觉神经性耳聋是由内耳,前庭耳蜗神经(第VIII号脑神经)或中枢听觉系统的病变造成的耳聋。感觉神经性耳聋分有先天与后天之分。先天性耳聋可由遗传(包括如 Usher 综合征等罕见遗
  • 恩达拉坦多恩达拉坦多是安哥拉西北部的城镇,也是北广萨省的首府,海拔高度670米,每年平均降雨量1,213毫米,雨量主要集中在3月和4月。1970年人口7,342,2010年人口增加至46,606。坐标:9°18′S
  • 国际社会国际社会一词,通常被用来指涉:国际社会的成员受国际法与国际习惯法的期待约束,而对和平、人权、人性尊严等普世价值均负有一定的道德责任。
  • 羞辱羞辱是贬抑一个人的自尊、傲气,以达致羞愧、导致谦卑(英语:Humility)的心态、降至卑贱身份或服从(英语:Deference),它是社会地位刚被降低的人所感受到的一种情感。它可以通过恐吓、
  • 俄历儒略历,是格里历的前身,由罗马共和国独裁官儒略·凯撒采纳埃及亚历山大的希腊数学家兼天文学家索西琴尼(英语:Sosigenes of Alexandria)计算的历法,在公元前45年1月1日起执行,取代
  • 黎巴嫩镑黎巴嫩镑 (阿拉伯语:ليرة لبنانية‎ lira libnaniyya;法语:livre libanaise;货币符号:ل.ل.‎;货币编号:LBP)为黎巴嫩流通货币。辅币单位皮阿斯特(英语:Piastre)。1镑=100皮