信号量

✍ dations ◷ 2025-11-22 22:08:07 #电脑术语,协同控制,荷兰发明

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

相关

  • 礼物经济礼物经济(英语:gift economy;礼物文化或礼物交换)是自古以来的自由价值经济学模式。交换过程中,给与者没有任何得到价值回报的要求和预期。与之相反,以物易物或者市场经济是用社会
  • 内颈动脉内颈动脉(internal carotid artery)位于头颈部两侧。总颈动脉在甲状软骨上缘水平(C3或C4)会分支为外颈动脉及内颈动脉。内颈动脉会经由颈动脉管(英语:Carotid canal)近入颅腔,供应大
  • 星尘号星尘号(Stardust)是一个美国发射的行星际宇宙飞船,主要目的是探测维尔特二号彗星。首次完成从彗星采样返回任务。1999年2月7日由NASA发射升空。返回舱于2006年1月15日在美国犹
  • FAA美国联邦航空管理局(英语:Federal Aviation Administration,缩写:FAA)是美国运输部下属、负责民用航空管理的机构;其管辖范围包括机场的建设与运行、航空交通管制、飞行员及飞机资
  • 台湾基督长老教会新楼医疗财团法人台南新楼医院台湾基督长老教会新楼医疗财团法人,简称新楼医疗财团法人,系由台湾基督长老教会于公元1985年10月24日捐助设立,设立时名为“财团法人台湾基督长老教会新楼医院”,公元2010年3月3
  • 勒内-罗贝尔·卡弗利耶·德·拉萨勒勒内-罗贝尔·卡弗利耶·德·拉萨勒(法语:René-Robert Cavelier, Sieur de La Salle),或称罗伯特·德·拉萨勒(1643年11月22日-1687年3月19日)是一个法国探险家。他探索了五大湖地
  • 低血镁症低血镁症(Hypomagnaesemia)是描述血液中的镁离子含量低于正常值的现象。正常人体内的血镁约介于 1.7–2.2 mg/dL 之间,如果血镁值低于 1.7 mg/dL(0.7 mmol/L)就是低血镁症。症
  • 潘 (希腊神话)潘(英文:Pan),是希腊神话里的牧神,牧神潘是众神传信者赫密斯的儿子,而名字的原意是一切。掌管树林、田地和羊群的神,有人的躯干和头,山羊的腿、角和耳朵。他的外表后来被天主教形象
  • Sox2n/an/an/an/an/an/an/an/an/an/aSRY盒-2(SRY:性别决定区,Sex Determining Region Y),又称“Sox2”(人的Sox2应写为SOX2),是一种对未分化的胚胎干细胞(ESC)、神经干细胞等再生能力以及
  • 阿拉尔库姆沙漠阿拉尔库姆沙漠(英语:Aralkum Desert)是一个自1960年代起逐渐形成的沙漠,位于哈萨克斯坦和乌兹别克斯坦交界的咸海。咸海原本是世界第四大湖,水源分别由阿姆河和锡尔河流入,不过在