信号量

✍ dations ◷ 2025-10-08 02:41:55 #电脑术语,协同控制,荷兰发明

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

相关

  • 可待因可待因(Codeine),化学式为C18H21NO3,是一种鸦片类药物(opioid),有止痛、止咳和止泻的药效,它的硫酸盐或磷酸盐常用于药品中。可待因是一种存在于鸦片中的生物碱,含量约占0.7-2.5%。它
  • 达豪纳粹集中营转移营比利时:布伦东克堡垒 · 梅赫伦转移营法国:居尔集中营 · 德朗西集中营意大利:波尔查诺转移营荷兰:阿默斯福特集中营 · 韦斯特博克转移营挪威:法斯塔德集中营部
  • 黄昏鸟目黄昏鸟目(学名:Hesperornithes)是生活于白垩纪已经灭绝,而且具有牙齿的鸟类,主要生活在北半球的海域与近海地区,以鱼类及其他海洋生物为主食。虽然有一些体型较小的种类可能具有飞
  • 石蚕石蛾,即毛翅目(Trichoptera),是一群具有水生幼虫和陆生成虫的昆虫。大约有14,500种被描述的物种,其中大部分可以根据成年口器分为完须亚目(英语:Integripalpia)(Integripalpia)和环须
  • 德川齐昭德川齐昭(1800年-1860年)是常陆国水户藩的第九代藩主,因此又称水户齐昭。幼名虎三郎、敬三郎,字子信,号景山、潜龙阁,谥号烈公。第15代将军(日本末代征夷大将军)德川庆喜的生父。他是
  • 鹿谷乡鹿谷乡(台湾话:.mw-parser-output .sans-serif{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Lato,"Helvetica Neue",Helvetica,Arial,sans-serif} Lo̍k
  • 弗迪格里斯河弗迪格里斯河(英语:Verdigris River,/ˈvɜːrdᵻɡrɪs/)是阿肯色河的一条支流,位于美国堪萨斯州的东南部和奥克拉荷马州的东北部,长约310英里(500千米),是密西西比河流域的一部分。
  • 阿尔内·蒂塞利乌斯阿尔内·威廉·考林·蒂塞利乌斯(瑞典语:Arne Wilhelm Kaurin Tiselius,1902年8月10日-1971年10月29日),出生于斯德哥尔摩,瑞典化学家,1948年获诺贝尔化学奖。1971年逝世于乌普萨拉
  • 查理三世 (西法兰克)(糊涂王)查理三世(法语:Charles III le Simple,879年9月17日-929年10月7日)西法兰克国王(898年-929年在位)。他属于已衰落的加洛林王朝,是国王路易二世的遗腹子。查理三世在其同父异母
  • 节理节理(英语:joint)是地质学名词。当岩层受力而变形、断裂,会产生破裂面。若破裂面两侧的岩块,没有明显沿着破裂面发生明显位移,称为节理,有时也称为裂隙;若有明显位移,则称为断层。岩