信号量

✍ dations ◷ 2025-09-11 21:37: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对象的线程会永久阻塞或超时返回。

相关

  • 抵抗力免疫(英语:immunity),指生物机体识别和排除抗原物质的一种保护性反应。其中包括特异性免疫(后天免疫系统)与非特异性免疫(先天免疫系统)。“免疫”一词,最早见于中国明代医书《免疫类
  • 欧亚板块欧亚板块(英语:Eurasian Plate)为包括大部分欧亚地区的板块,但不含括南亚的印度半岛(印度次大陆)、西南亚的阿拉伯半岛(阿拉伯次大陆)以及东西伯利亚的上扬斯克山脉以东(属鄂霍次克板
  • 哈特福哈特福德(英语:Hartford)是美国康涅狄格州的首府,在该州的中部偏北,依康涅狄格河而立。其有保险公司。是世界保险业的大本营。据2000年普查,该市有人口12万1578人。2005年的最新普
  • 吹气测试体内酒精测定仪(英语:breathalyzer)或呼气式酒精检测仪(breathalyser,breath和analyzer/analyser的混成词)是一种根据呼气样本测定血液酒精浓度的设备。Breathalyzer是一个品牌名
  • 袋狼袋狼(学名:Thylacinus cynocephalus),现已全部灭绝,因其身上斑纹似虎,又名塔斯马尼亚虎,曾广泛分布于新几内亚热带雨林、澳大利亚草原等地,后因人类活动只分布于塔斯马尼亚岛。袋狼
  • 硬颚挤喉音(Palatal ejective)是一种辅音,出现于一些口语中。国际音标将此音记作⟨cʼ⟩,其对应的X-SAMPA音标为c`_>。硬颚挤喉音的特征包括:此音主要出现在一些美洲原住民的语言
  • 毛石肠梗阻症候群毛石肠梗阻症候群(Rapunzel syndrome)也称为长发公主症症候群,是罕见的人类消化道疾病,是因为吃毛发所造成(食毛癖(英语:trichophagia))。其英文名称得名自格林童话中的长发姑娘Rapun
  • 科丽塔·斯科特·金科丽塔·斯科特·金(英语:Coretta Scott King,1927年4月27日-2006年1月30日),是一位美国作家,活动家。是美国民权运动领袖马丁·路德·金的遗孀。科丽塔·斯科特·金是非洲裔美国人
  • 生物系统生物系统(Biological system),又称身体系统(Body system)、器官系统(Organ system),是生物的其中一个组成部分,是由许多不同的器官共同组合而成,执行某种特定的生理作用。人体的系统是
  • 内联缓存内联缓存(Inline caching)是部分编程语言的运行时系统采用的优化技术(英语:Compiler optimization),最早为Smalltalk开发。内联缓存的目标是通过记住以前直接在调用点(英语:Call sit