信号量

✍ dations ◷ 2025-04-18 17:52:27 #电脑术语,协同控制,荷兰发明

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

相关

  • 肺泡蛋白沉积症肺泡蛋白沉着症(pulmonary alveolar proteinosis,PAP),又名肺泡蛋白沉积症,是一种罕见的肺部疾病。患者体内肺表面活性物质衍生的脂蛋白化合物在肺泡内异常聚积,干扰肺部正常的气
  • 嘉靖嘉靖(公元1522年 - 1566年)是明世宗朱厚熜的年号,明朝使用嘉靖这个年号一共45年,是明朝使用第二长的年号。嘉靖,出自《尚书·无逸》中“嘉靖殷邦”之语。明世宗即位时内阁备选年
  • u广州市/u (1949–1954)广州市,中华人民共和国已撤销的直辖市。1949年10月,广东战役后,解放军攻占广州市。21日,成立解放军广州市军事管制委员会;28日,成立广州市人民政府。为中央人民政府直辖市。当时,中
  • 冯 甦冯甦(1628年-1692年),清朝政治人物。字再来,号蒿庵,浙江临海涌泉人。顺治十五年(1658年)进士,授永昌推官。康熙十六年(1677年)授广东巡抚。康熙十七年(1678年)入为刑部右侍郎。编纂《楚雄
  • 杰里米·科尔宾反对党领袖 工党领袖选举 2015年英国工党领袖选举 2016年英国地方选举(英语:United Kingdom local elections, 2016) 2016年伦敦议会选举(英语:London Assembly election, 2016)
  • 铠甲虾类铠甲虾(Squat lobsters),也直译作蹲龙虾,是一种腹部扁平的甲壳类动物,有长的尾巴,往下弯至胸部。现时铠甲虾类生物可大致分为两大家族:铠甲虾总科(Galatheoidea)及劣柱虾总科(Chirosty
  • 江南陆师学堂江南陆师学堂创设于清朝光绪二十二年(1896年)是一所近代学堂。位于江宁(现江苏南京)城北妙耳山,中山北路283号和察哈尔路37号。该校由两江总督张之洞请奏创办。钱德培、俞明震等
  • 禅 (消歧义)禅在中文原意是“帝王的祭天地之礼”或“禅让王位”;佛教传入后,作为梵语“dhyāna”的音译。
  • 机动战士高达外传 宇宙、闪光的尽头… 《机动战士高达外传 宇宙、闪光的尽头…》(日语:機動戦士ガンダム外伝 宇宙、閃光の果てに…)是高达游戏系列作品中以游戏形式推出高达外传的第三作,原本是
  • 昆士兰阿胡虾虎鱼昆士兰阿胡虾虎鱼(学名:),为辐鳍鱼纲鲈形目虾虎鱼亚目虾虎鱼科阿胡虾虎鱼属下的一个种,为热带淡水鱼,分布于澳洲昆士兰及新几内亚淡水水域,体长可达18公分,栖息在受潮汐影响、沙泥底