信号量

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

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

相关

  • 溃疡溃疡是身体膜状构造的不连续或破裂,妨碍受影响器官的正常功能。根据罗宾斯病理学课本的说法:“溃疡是皮肤、上皮、黏膜的连续性受破坏,起因于发炎的坏死组织脱落。”医学上常见
  • 加合物加合物(Adduct)指的是两个或多个不同的分子,通过互相加合得到的产物。典型的如三氟化硼与氨加合形成的H3N→BF3。电荷转移配合物也可被看作加合物。
  • 特拉华特拉华州(英语:State of Delaware),或译德拉维尔州,简称特州,为美国的一州,是最早加入美国联邦的州,所以又有“第一州”这个称呼。“第一州”这个称呼来自特拉华州是第一个复决通过
  • 伍迪·艾伦海伍德·“伍迪”·艾伦(英语:Heywood "Woody" Allen,1935年12月1日-),本名艾伦·斯图尔特·柯尼斯堡(英语:Allen Stewart Konigsberg),美国电影导演、编剧、演员、喜剧演员、作家、剧
  • 554年宇文泰-507年出生
  • 加文·纽森加文·克里斯托弗·纽瑟姆(英语:Gavin Christopher Newsom,1967年10月10日-),又译纽斯萨姆、纽瑟姆或纽萨姆,美国民主党籍政治人物。现任(第40任)加利福尼亚州州长,曾任旧金山市长、
  • 金岭镇金岭镇是中国山东省淄博市临淄区下辖的一个镇。现辖:金南社区、金岭一村、金岭二村、金岭三村、金岭四村、金岭五村、金岭六村、艾庄村、刘辛村和披甲村。
  • 布莱斯峡谷国家公园布莱斯峡谷国家公园(Bryce Canyon National Park)是位于美国犹他州西南部的国家公园。其名字虽有峡谷一词,但其并非真正的峡谷,而是沿着庞沙冈特高原东面,由侵蚀而成的巨大自然露
  • 骨龄骨龄是一种用以描述青少年骨骼发育程度的数据。在人类的生长期内,从婴幼儿到成年人,骨骼的形态、大小都会有所变化。而这种变化可以利用X射线检查到。骨龄的相关数据是根据同
  • 喜玛拉雅棕熊喜玛拉雅棕熊(学名:)是棕熊的一个亚种。它们一般都是沙色或红褐色。它们栖息在喜玛拉雅山山脚及巴基斯坦,但不会超越丹希冈国家公园及克什米尔。它们的实际数量不明,只知很稀少。